cdq 分治

LG 题单


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]\)

posted @ 2023-10-13 23:31  ft61  阅读(17)  评论(0编辑  收藏  举报