[学习笔记]CDQ分治

发现我对CDQ分治的理解过于浅显。
水平太差。

有三类问题。

解决和点对有关的问题

这类问题多用于统计特殊 \((i,j)\) 的数量/使某类点对返回值函数的值最值。

我们考虑分治:

我们递归处理\([l,mid],[mid + 1,r]\)

然后通过某数据机构/算法处理\([l,mid] \to [mid + 1,r]\)

1D/1D动态规划

1D/1D 动态规划指的\(dp\)数组为一维,转移复杂度为\(O(n)\)

我们可以依旧是套路的处理。

我们递归处理\([l,mid],[mid + 1,r]\)

然后通过某数据机构/算法处理\([l,mid] \to [mid + 1,r]\)

但是两者之间的关系我们需要进行一个处理。

我们可以考虑CDQ分治的递归树为一颗线段树,CDQ分治为这棵树的中序遍历。

我们始终遵循\(x \to y\),我们先处理完全\(x\),再处理\(x \to y\),再处理\(y\) 的原则。

将动态问题转化为静态问题

这类问题通常为「需要支持做 xxx 修改然后做 xxx 询问」的数据结构题。该类题目有两个特点:

  • 如果把询问 离线,所有操作会按照时间自然地排成一个序列。
  • 每一个修改均与之后的询问操作息息相关。而这样的“修改 - 询问”关系一共会有\(O(n ^ 2)\)对。

我们此时把时间维作为第一维统计。

如果修改之间是独立的,我们无需处理左右递归处理和跨域操作的关系,但如果操作依赖前面的操作,我们则依旧要遵循左先,转移,右后的原则。

例题将在配套练习记录中给出。

posted @ 2021-12-13 21:34  fhq_treap  阅读(53)  评论(0编辑  收藏  举报