cdq 分治
cdq 分治是一种思想而不是具体算法,核心仍是处理跨过当前区间中点的贡献
从嵌套数据结构的观点看,cdq 分治就是树套树外层树的遍历,优点是空间少一个 \(\log\) 且常数更小
依据递归顺序可以分为两种
后序遍历
与普通分治类似。注意这种分治顺序可以归并排序
高维偏序
LG3810 【模板】三维偏序(陌上花开)
先按 \(a\) 排序,处理当前区间时左子区间对右子区间已经满足了第一维偏序
嵌套数据结构
把左右子区间分别按 \(b\) 排序,通过双指针可以满足第二维偏序,剩下的问题是 \(c\) 上的单点插入、区间求和,随便用数据结构维护即可(注意清空)
嵌套 cdq
新建一维 \(d\in\{0,1\}\) 标记来自哪个子区间,问题被转化成了 \(b,c,d\) 的三维偏序。但 \(d\) 这一维非常容易处理,本质上等价于 \(b,c\) 的二维偏序(从另一个角度可以把 \(d=0\) 看作插入,\(d=1\) 看作询问),继续嵌套 cdq 解决即可
本题的偏序关系是 \(\le\),不过并不影响,直接对 tuple
排序是正确的
处理带修询问
把时间当作一个维度,那么修改对询问有贡献当且仅当时间上偏序,cdq 消掉这一维后变成了静态问题
中序遍历
这仍然满足处理当前区间时两个子区间的相对顺序不变,但左子区间已经处理完毕了
优化 1D/1D 动态规划
cdq 的分治顺序保证了计算 \(i\) 的 DP 值时 \(i\) 之前的 DP 值都算完了,\(j<i\) 是天然的偏序,DP 又是天然的离线,非常适合 cdq
LG4093 [HEOI2016/TJOI2016] 序列
记 \(mx[i],mn[i]\) 为位置 \(i\) 可能的最值
类似 LIS DP,转移条件是 \(i<j,mx[i]\le a[j],a[i]\le mn[j]\)