[做题记录-乱做][APIO2016] 烟火表演 题解
题意
- 给你一棵有根树, 边有边权, 你可以每次花费 \(1\) 个代价让一条边的边权变化 \(1\) ,求让所有叶子节点深度相同的最小代价。
- \(n \leq 3\times 10^5\) 。
题解
属于是抄完题解发题解。
首先有一个边权只可以增加的版本是 [ZJOI2017] 时态同步, 但是这题和那个啥关系没有。
因为qiu说这玩意是折线相关那意思就是我可以大力设 \(f_{x, i}\) 表示 \(x\) 的子树内的点结束时间为\(i\)这种东西然后维护折线大力转移。也就是考虑维护一个函数 \(f_u(x)\) 。不难发现这个函数是下凸的。
然后这个函数怎么维护嘞, 小编也不知道, 这种东西也能维护是怎么回事呢?
考虑这么一个事情, 我们只维护函数的转折点, 也就是斜率发生了变化的点, 然后你发现一个很神奇的事情是, 如果我们让一个转折点表示斜率 \(-1\), 那如果利用下标表示这个转折点, 对两个函数做加法就是把这两个序列直接合并!
那么我们确定好这样维护一堆转折点, 然后根据转折点讨论折线的转移就好了。
讨论转移的部分由于一次折线的斜率变化是 \(1\), 那么可以每次找到当前点的最优解的区间 \([L, R]\) 然后讨论其对于父亲的贡献。具体找这个区间的方法就是可以发现一个函数中斜率为正的点的个数就是他儿子的个数, 把儿子个数的点弹掉就会剩下前面的和 \(L, R\) 。
计算答案的时候, 直接通过 \(f_{rt}(0)\) 然后把答案推出来就行。
好强的脑洞啊/se。
啊你说为什么题解写这么拉? 因为别人写得好多了。