CDQ分治总结
Posted hlw1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CDQ分治总结相关的知识,希望对你有一定的参考价值。
终于学了 CDQ 分治了
简介
CDQ 分治是一个神奇的算法,它可以代替一些毒瘤的数据结构,而且常数极小,但美中不足的是它要求离线。
它一般用来解决序列上的一些点对问题,大概是如下流程:
将序列分为三类:
(lle i le mid, 1 le j le mid) 的点对
(mid < i le r,mid < j le r) 的点对
(l le i le mid,mid < j le r) 的点对
显然第一类和第二类我们可以递归处理,所以我们只需要考虑第三类的处理方式。
具体的可以康康 OI-Wiki 上的,写的很好(比我的好多了),虽然码风有些奇特......
例题
二维偏序
可以尝试用 CDQ 分治来写一下树状数组 1 的模板题。
三维偏序
给出一些元素,每个元素有三个属性值 a, b, c ,询问对于每个元素 i ,满足 (a_j le a_i,b_j le b_i ,c_j le c_i) 的 j 的个数。
首先将序列按照 a 排序,此时的序列已经满足了第一维的有序,然后开始 CDQ 。
我们先递归处理 [l, mid] 和 [mid + 1, r] ,因为我们已经保证了第一维的有序,那么对于 (i in [l,mid]) 和 (j in [mid+1,r]) ,一定有 (a_i le a_j) ,所以我们可以放心的将 [l, mid] 和 [mid + 1, r] 的元素按照 b 排序,然后用两个指针扫描这两段,用树状数组来维护第三维。如果 (b_ile b_j) ,我们就在树状数组中 (c_i) 的位置 +1 ,并将指针 i 右移一位,否则我们就在树状数组中统计小于等于 (c_j) 的元素个数,即 query(c[j]) ,计入 j 的答案,并将指针 j 右移一位。
复杂度:(O(nlog^3n))
四维偏序
这个需要用到 bitset
复杂度:(O(frac{n^2}{32}))
我也不会
练习题
以上是关于CDQ分治总结的主要内容,如果未能解决你的问题,请参考以下文章