概述:
cdq分治是一类分治思想, 和整体二分类似, 在一些可离线的题目中可以替代一些复杂的数据结构.
cdq分治的一个重要思想是用一个子问题来计算另一个子问题的贡献.
以三维偏序为例:
实现:
与二维偏序一样, 首先需要按第一维进行排序, 保证第一维的有序.
由于第一维有序, 此时对整个区间进行分治, 将左区间的信息统计到右区间的贡献, 便可以消除第一维的影响.
同时由于已经进行了分治, 第二维可以使用归并排序, 统计第三维信息时使用树状数组即可.
至于这样分治为什么行:
从图中可以看出, 对于每一个点, 分治的过程相当于将这个点左边的区间分成了若干块, 合起来便是这个点左边区间的贡献.
需要注意原例题中需要去重.
代码:
1 |
|