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