APIO2016烟火表演 可并堆
[APIO2016]烟火表演 大约是退役前最后一篇题解,把之前的坑填上。只说一下思路,细节可以看其它题解 首先考虑一个DP:令$f_{x,i}$表示$x$点,到叶子的长度为$i$的最小代价。那么考虑合并,有$f_{x,i} = \min_{j \leq i} f_{y,j} + i-(j+c)$。 考虑把这个DP分步进行:首先把到父亲的边加上,之后合并。令加上到父亲边后的函数为$g$ 可以注意到,$f$是一个凸函数。并且这个函数的斜率是整数。可以感性理解这个结论:当长度变化时到一定阶段时,需要调整更多的边。并且每条边的代价都是$1$。 那么考虑对$g$的求解:小于$\min f$时,只调整父亲边,大于时使用$\min f$并调整父亲边。中间部分是平的。核心思想就是使用靠近$\min f$的值 注意到分界点数量是$O(n)$的,可以维护分界点。每次合并分为以下过程:找到平的一段,把它后面的删掉,在平的前后各插入一条线。 于是用可并堆维护分界点即可。有几个地方:
- 如何维护分界点:假设每个点都让斜率+1即可
- 如何找到平的一段:根据做法归纳可知只需弹掉度数-1个
- 如何修改分界点:注意到需要做的操作是加入斜率为-1的一段,可以平移它后面的一段(即min)实现
- 如何求答案:答案即到父亲边权为0的值,即根平的那一段的值。用边权和可以推出
1 |
|