[学习笔记]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)\)对。
我们此时把时间维作为第一维统计。
如果修改之间是独立的,我们无需处理左右递归处理和跨域操作的关系,但如果操作依赖前面的操作,我们则依旧要遵循左先,转移,右后的原则。
例题将在配套练习记录中给出。