【学习笔记】CDQ分治
具体思路
-
CDQ分治对于一个操作序列,使用类似归并求逆序对的神奇方法消除时间维度的影响。
-
即对于一个操作序列,先将其左右两部分进行递归处理,再计算左侧的修改对右侧的查询的贡献。
-
我们发现,递归处理以后,因为贡献已经计算完毕,所以时间的前后不再有意义。
-
此时,我们就可以对左右两边分别进行瞎搞,但是肯定是向着有利于复杂度的方面搞。
-
我们将两边按照某一关键字进行排序,然后根据题目要求,让左边的某一部分修改对右边的某个查询进行贡献。
-
注意,计算贡献是不要把修改和查询混到一起,因为让查询对修改进行贡献或让查询对查询进行贡献就变成米奇不妙屋了。
-
注意到我们消掉了一维,所以可以考虑用CDQ来对题目降维打击。
-
纯CDQ复杂度为 \(O(n)\) ,再加上你优秀的数据结构就是 \(O(n \log n)\) 。
CDQ整活
二维矩形数点问题
- 按照操作顺序把每个不一样的平面拎出来,变成三维问题,此时动态二维问题已经变成了静态三维问题,用CDQ将时间维进行降维打击,再整个活利用二维差分把 4 - sat 转 2 - sat,发现一个点对某次查询的贡献的条件没有那么阴间了,所以把查询和修改混在一起再用CDQ对纵坐标进行降维打击,剩下的一维用树状数组干就完了。
查询动态逆序对个数
- 整活就完了,还是升维转静态,再利用逆序对中每个数的性质进行反复降维打击,最后树状数组整活。
CDQ套CDQ
-
上面已经说了,就是反复降维打击。
-
注意,套一个CDQ复杂度就多一个 \(\log\) 。
例题
暂无
优缺点
优点
- 速度快,码量小,理解易。
缺点
- 必须离线。