CDQ分治
概述
CDQ分治, 用类似归并求逆序对的思想, 对一段修改/查询等二分, 递归求解左右两端子问题, 并计算左边修改等, 对右边查询等的贡献
具体如:
solve(int l, int r)
{
solve(l, mid);
...(左边对右边的贡献)
solve(mid + 1, r);
/*
递归写的位置取决于具体情况
如左边询问对右边产生影响时先solve(l,r)在计算贡献
如果右边询问被左边更新后,会对更右边的询问产生影响,则solve(mid+1,r)要后做
等等
*/
}
可以解决偏序,以及斜率不有序的斜率优化DP等问题
因为求解左区间对右区间影响时, 左边整体对右边有序(如DP时下标,或偏序时的某一维坐标),从而可以使左右区间内部各自以其他排序标准排序, 从而达到降维,排序等目的,简化问题
A - Jam's problem again HDU - 5618
B - Pinball Game 3D HDU - 4742
C - Crowd HDU - 4456
D - 动态逆序对 HYSBZ - 3295
E - 货币兑换Cash HYSBZ - 1492
F - 序列 HYSBZ - 4553
易错点
- 排序写挂
- 解决子问题的与处理贡献的先后没考虑清楚
- 题意读错