闲扯
咕了不知道多久的 $CDQ$ 分治,今天终于初步学了一下。。
题面
Solution
$CDQ$ 能解决的最基础的问题是二维偏序问题,例如树状数组的单点加和区间求和。
当问题拓展到三维时,我们需要先对其中一维排一下序,这样问题就剩下两维了。
但是我们能处理的只剩一维,还有一维怎么办?
这时候就需要用其他的东西来处理剩下的这一维,列如树状数组或者再套一层 $CDQ$。
对于这题,我们先将序列按照 $a$ 从小到大排一次序,这样我们只需要处理 $b,c$ 这两维。
进行 $CDQ$ 分治时,我们先递归处理左右子区间,然后统计左区间对右区间的贡献。
我们先将两个子区间按照先 $b$ 后 $c$ 的顺序排个序,然后依次枚举右区间的每一个数。将左区间里面所有还未加入且 $b_i<=b_j$ 的贡献加入树状数组(里面维护的是 $c$ 小于 $c_k$ 的个数),然后查询当前的所有 $c<c_j$ 的个数。
处理完该区间之后,我们将所有加入了树状数组的数删去,然后进入下一轮求解即可。
Code
1 |
|
总结
$CDQ$ 分治听说是个应用十分灵活的算法,只做一道模板题显然不行,需要更多的练习才行。