CDQ分治

CDQ分治

CDQ 分治是一种思想而不是具体的算法,与 动态规划 类似。目前这个思想的拓展十分广泛,依原理与写法的不同,大致分为三类:

  • 解决和点对有关的问题。
  • 1D 动态规划的优化与转移。
  • 通过 CDQ 分治,将一些动态问题转化为静态问题。

我遇到的CDQ

解决和点对有关的问题

这类问题多数类似于「给定一个长度为 n 的序列,统计有一些特性的点对 (i,j) 的数量/找到一对点 (i,j) 使得一些函数的值最大」。

CDQ 分治解决这类问题的算法流程如下:

  1. 找到这个序列的中点 mid
  2. 将所有点对 (https://img2024.cnblogs.com/blog/3077605/202408/3077605-20240806120032822-59153689.gif) 划分为 3 类:
    1. 1 \leq i \leq mid,1 \leq j \leq mid 的点对;
    2. 1  \leq i \leq mid ,mid+1 \leq j \leq n 的点对;
    3. mid+1 \leq  i \leq n,mid+1 \leq j \leq n 的点对。
  3. (https://img2024.cnblogs.com/blog/3077605/202408/3077605-20240806120032822-59153689.gif) 这个序列拆成两个序列 (https://img2024.cnblogs.com/blog/3077605/202408/3077605-20240806120032822-59153689.gif)(https://img2024.cnblogs.com/blog/3077605/202408/3077605-20240806120032822-59153689.gif)。此时第一类点对和第三类点对都在这两个序列之中;
  4. 递归地处理这两类点对;
  5. 设法处理第二类点对。

可以看到 CDQ 分治的思想就是不断地把点对通过递归的方式分给左右两个区间。

在实际应用时,我们通常使用一个函数 solve(l,r) 处理 l \leq i \leq r,l \leq j \leq r 的点对。上述算法流程中的递归部分便是通过 solve(l,mid)solve(mid,r) 来实现的。剩下的第二类点对则需要额外设计算法解决。

posted @ 2024-08-06 12:01  Ke_scholar  阅读(3)  评论(0编辑  收藏  举报