您的位置:首页 > 其它

CDQ分治与斜率优化DP——学习笔记

2017-02-17 12:03 239 查看
我们知道当斜率优化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分治的这种动态转静态的思想特别好,许多数据结构题都适用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: