CDQ分治
CDQ分治
CDQ 分治是一种思想而不是具体的算法,与 动态规划 类似。目前这个思想的拓展十分广泛,依原理与写法的不同,大致分为三类:
- 解决和点对有关的问题。
- 1D 动态规划的优化与转移。
- 通过 CDQ 分治,将一些动态问题转化为静态问题。
我遇到的CDQ
解决和点对有关的问题
这类问题多数类似于「给定一个长度为 n 的序列,统计有一些特性的点对 的数量/找到一对点
使得一些函数的值最大」。
CDQ 分治解决这类问题的算法流程如下:
- 找到这个序列的中点
;
- 将所有点对
划分为 3 类:
的点对;
的点对;
的点对。
- 将
这个序列拆成两个序列
和
。此时第一类点对和第三类点对都在这两个序列之中;
- 递归地处理这两类点对;
- 设法处理第二类点对。
可以看到 CDQ 分治的思想就是不断地把点对通过递归的方式分给左右两个区间。
在实际应用时,我们通常使用一个函数 solve(l,r)
处理 的点对。上述算法流程中的递归部分便是通过
solve(l,mid)
与 solve(mid,r)
来实现的。剩下的第二类点对则需要额外设计算法解决。