我们知道当斜率优化DP中的点的x坐标不单调时,需要splay来维护凸壳,但是代码量比较大,容易写挂。
我们还有一种神奇的做法:CDQ分治。
先把n个状态排成一个序列。考虑一个分治过程solve(L,R),每次分成[L,mid],[mid+1,R]两部分。
显然对于fi只和1~i-1有关,所以我们solve(L,mid)递归求解,即可得到[L,mid]的所有f值。
现在我们需要考虑用[L,mid]中求出的值去更新[mid+1,R]中的待求的f:
这个子问题已经是静态的了,然后我们就可以排序了。
对于[L,mid]中的所有决策点按x排序,然后就可以线性构造出这个凸壳。
再对[mid+1,R]中的状态按斜率排序。这样又能线性在凸壳中找到最优点。是不是很妙啊。
总复杂度O(Nlog^2N)。虽然多了一个log, 但是编程复杂度降低了很多,对于写不动大数据结构的老年人选手是很好的选择。
CDQ分治的这种动态转静态的思想特别好,许多数据结构题都适用。