CDQ分治

课件链接

CDQ分治

[BOI2007]MOKIA

题意:一个2000000*2000000的棋盘,每个格子有一个数,维护两种操作:

ADD x, y: a A[x, y] += a;

QUERY x0, y0, x1, y1: 询问矩阵内的和。

CDQ分治时按x维排序使用扫描线,y维使用树状数组。每个询问拆成两部分,(x0, y0, y1)与(x1, y0, y1)。

扫描到x0时,贡献为负,ans -= sum(y0, y1), 扫描到x1时贡献为正,ans += sum(y0, y1)。

 

[VIOLET3]天使玩偶

维护二维点集。1.插入点(x, y),2.询问离(x, y)曼哈顿距离最近的点的距离。

CDQ分治需要分类讨论。左下,左上,右下,右上部分点的最近点。以左下为例。即求左下中x+y的值最大的点。

无1操作时,按x维排序,树状数组处理。

有1操作时,CDQ分治时按x维排序,处理同无1操作。

 

三维偏序统计问题。参见上一篇博文。

 

四维偏序simle版判定。

四维的点集。判断每个点是否存在一个点比它大。大的定义为四维中任意一维都比它大。

考虑对任一点,是否存在某一点四维都比它小。

按第一维排序后,有了时间限制。等价于任一点,排在前面的点是否存在其他三维都比它小。

因为是判定性问题,我们可降一维,判断第二维与第三维比它小的点中第四维的最小值,改为非判定性问题。

可用CDQ分治再降一维。

CDQ分治时按第二维排序,第三维使用树状数组,求前缀最小值即可。

 

四维偏序normal版统计

四维的点集,求最长上升子序列,即求每个点比它小的点的个数。

两次CDQ分治。不会。

 

五维偏序统计

四维的点集,求最长上升子序列,即求每个点比它小的点的个数。

三次CDQ分治?多了两个log常数大,性能可能不及O(n^2)。

 

[FJOI2012]长度为N的数组开始为空。每次执行操作Pi, Qi, 表示在Pi位上填上Qi,输出每次操作后的逆序对数。

CDQ分治,合并统计时可离散化+树状数组搞一下即可。

 

还有DP上的CDQ分治,没有学,道理类似。

 

===========================================================================================================

总结:

CDQ分治是基于时间分治。

在线问题离线化。

CDQ分治后可降维。

 

 

原文地址:https://www.cnblogs.com/dirge/p/5803635.html