当前位置: 首页 > news >正文

Solution - P3642 [APIO2016] 烟花表演

主观难度:【3】

我草。神仙题。


Hootime 太菜了没能理解题解的理解于是自己理解了一个理解。(什么鬼)

我们能很容易地发现 \(dp_{u, i} = \sum \min_{0 \le j \le i} \{ dp_{v, i-j} + |w_v - j| \}\)\(j\) 的意义是 \(w_v\) 调整后的值。乍一看,优化不了。

我们感觉 \(dp_i\) 是一个分段线性的凸函数。暂时不会证。但的确是。然后从这里开始思考。

先想一想怎么转移子树最优。以下设 \(dp_v\) 上斜率为 \(0\) 的区间为 \([L, R]\)\(dp'_u\) 为将要合并至 \(u\) 的函数。

  • \(i \le L\):这时 \(j\) 应取到 \(0\)。因为 \(i \le L\) 时斜率不大于 \(-1\),所以 \(dp_{v, i-(j+1)}-dp_{i-j} \ge 1 = w_v - (w_v-1)\),向上调整 \(j\) 得不偿失。此时 \(dp'_{u, i} = dp_{v, i}+w_v\)
  • \(L < i \le L+w_v\):这时我们应该调整 \(j\) 使得 \(i-j \in [L, R]\),发现可以取 \(i-L\),这时 \(i-j\) 正好取到 \(L\)。若在此基础上调大 \(j\) 会引起 \(i-j\) 减小,如上这样是不优的;调小 \(j\)\(dp_{v, i-j}\) 没什么影响,但是会引起 \(|w_v - j|\) 增大,也不优。综上,此时 \(dp'_{u, i} = dp_{v, L} + (w_v-i+L)\)
  • \(L+w_v < i \le R+w_v\):我们发现,\(j\)\(w_v\) 时总有 \(i-j \in [L, R]\)。于是 \(dp'_{u, i} = dp_{v, L}\)
  • \(i > R+w_v\):我们只能伸长 \(w_i\),使 \(i-j = R\),否则仍然是得不偿失。于是,\(dp'_{u, i} = dp_{v, L} + (i-R-w_v)\)

综上:

\[dp'_{u, i} = \begin{cases} dp_{v, i}+w_v & i \le L \\ dp_{v, L} + (w_v-i+L) & L < i \le L+w_v \\ dp_{v, L} & L+w_v < i \le R+w_v \\ dp_{v, L} + (i-R-w_v) & i > R+w_v \end{cases} \]

然后我们就可以证 \(dp_u\) 为凸函数了。起始状态显然是凸函数,两凸函数相加并不影响凸性。如上变换的几何本质为将 \(x \le L\) 的部分抬升 \(w_v\),剩下的地方用三个斜率分别为 \(-1, 0, 1\) 的一次函数拼起来,并不影响凸性。

然后这就是一个很明显的 slope trick,上可并堆维护拐点即可。答案为 \(\min dp_{1, i}\)

下面是关于写法的东西。

我们很懒,懒得维护斜率。注意到一个函数经过变换后最后一段斜率为 \(1\),又注意到 \(dp_u = \sum dp'_u\),而 \(dp'_u\) 每一个儿子只能提供一个,于是得到最后一段的斜率为 \(u\) 的出度。又由于可并堆中每个值代表 \(+1\) 的斜率变化,就容易得出需要删多少点。

我们很懒,懒得维护函数的具体值。于是注意到 \(dp_{u, 0}\)\(u\) 子树内所有边权和。对于每一个左侧斜率小于 \(0\) 的横坐标 \(x\),容易发现 \(\min dp_1 = dp_{1, 0} + \sum x\)。至于具体原因可以自己推,证明懒的写了。

#include <bits/stdc++.h>
#define llong long long
#define N 300005
using namespace std;#define bs (1<<20)
char buf[bs], *p1, *p2;
#define gc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,bs,stdin),p1==p2)?EOF:*p1++)
template<typename T>
inline void read(T& x){x = 0; int w = 1;char ch = gc();while(ch < '0' || ch > '9'){if(ch == '-') w = -w;ch = gc();}while(ch >= '0' && ch <= '9')x = (x<<3)+(x<<1)+(ch^48), ch = gc();x *= w;
}
inline void read(char& x){x = gc();if(x == ' ' || x == '\r' || x == '\n') x = gc();
}
template<typename T, typename ...Args>
inline void read(T& x, Args& ...y){return read(x), read(y...);
}int n, m;
int fa[N], w[N], deg[N];llong val[N<<2];
int ls[N<<2], rs[N<<2], dep[N<<2], root[N];
int sta[N<<2], top;inline void prework(){for(int i = (N<<2)-1; i; --i) sta[++top] = i;
}
inline int newnode(llong k){val[sta[top]] = k, dep[sta[top]] = 1;ls[sta[top]] = rs[sta[top]] = 0;return sta[top--];
}
inline void delnode(int x){if(!x) return;sta[++top] = x;
}
inline void merge(int& x, int y){if(!x || !y) return x = x|y, void();if(val[x] < val[y]) swap(x, y);merge(rs[x], y);if(dep[ls[x]] < dep[rs[x]]) swap(ls[x], rs[x]);dep[x] = dep[rs[x]]+1;
}
inline void pop(int& x){int y = x;merge(ls[x], rs[x]);x = ls[x], delnode(y);return;
}llong ans = 0;int main(){freopen("in.txt", "r", stdin);read(n, m), n += m;prework();for(int i = 2, x; i <= n; ++i){read(fa[i], w[i]), ans += w[i];++deg[fa[i]];}for(int i = n; i >= 2; --i){while(deg[i]-- > 1) pop(root[i]);llong r = val[root[i]]; pop(root[i]);llong l = val[root[i]]; pop(root[i]);merge(root[i], newnode(l+w[i])), merge(root[i], newnode(r+w[i]));merge(root[fa[i]], root[i]);}while(deg[1]--) pop(root[1]);while(root[1]) ans -= val[root[1]], pop(root[1]);printf("%lld", ans);return 0;
}
http://www.jsqmd.com/news/432884/

相关文章:

  • 六轴机械臂粒子群轨迹规划与关节动态特性展示:包括收敛曲线、位置、速度及加速度曲线,并支持多种智...
  • 用投入换未来,从爱奇艺财报看它的新打法
  • 基于YOLO26深度学习的无人机视角河道水面垃圾检测系统【python源码+Pyqt5界面+数据集+训练代码】
  • 【开题答辩全过程】以 基于Web的医院日间手术管理系统设计与实现为例,包含答辩的问题和答案
  • 成都小程序开发公司排名|性价比高、不踩坑 - 企业数字化改造和转型
  • 【开题答辩全过程】以 基于Web的学生就业管理系统为例,包含答辩的问题和答案
  • 2026开学第一周
  • 200 本电子书乱糟糟?Reader + cpolar 让碎片时间都能高效读
  • Nginx 高分实战博客:从原理到生产优化的完整指南
  • LLM-VN LLM-Enhanced Rumor Detection via Virtual Node Induced Edge Prediction
  • 2026 小程序开发公司十强|避坑要点 + 选择标准一次说清 - 企业数字化改造和转型
  • 强劲性能+超大电池,荣耀WIN畅快游戏不设限
  • 荣耀400以开放推进创新 驱动行业体验升级
  • PCC框架: FACT-CHECKING WITH LARGE LANGUAGE MODELS VIA PROBABILISTIC CERTAINTY AND CONSISTENCY
  • Python print full text via pprint
  • 深圳小程序公司大盘点:报价、案例、口碑一次看清 - 企业数字化改造和转型
  • 2026 年 TOP10 小程序开发公司行业报告!十大服务商深度剖析 - 企业数字化改造和转型
  • 2026年8款AI字幕与语音转文字工具深度评测:教育、LD与企业培训选型指南
  • KIRIN HYOKETSU通过本地生产进军美国即饮饮料市场
  • 离线数仓的优化及重构
  • 把激光雷达干到500线以上,华为乾崑到底图什么?
  • ydata-profiling 汉化魔改
  • 【开题答辩全过程】以 基于web的学校田径运动会管理系统开发与实现为例,包含答辩的问题和答案
  • 2026年3月桥梁模板实力厂家,彰显国产技术实力 - 品牌鉴赏师
  • Go - fmt.Scanln()
  • 2026年3月三氟甲基丙烯酸厂家推荐,售后体系完善实用指南 - 品牌鉴赏师
  • 适配国人肤质 自然堂三八赞「美」礼盒开启科学护肤新体验 - 速递信息
  • PLSQLDEV.EXE-无法找到入口
  • Yi.Net平台管理--工作流
  • VS Code 配置 Markdown 环境