CDQ分治学习
声明:此算法不适用于强制在线题。
一切是从归并排序求逆序对开始的。
我们先假装已经分治完左边和右边,又回溯到了某一处
现在我们要合并了
左边和右边的答案已经算完
考虑跨越mid的逆序对的个数
注意到逆序对的定义,
首先 是肯定可以保证的
所以需要考虑的仅仅是
做到这一点应该不难。
接下来引出简单又自然的CDQ分治
刚刚的归并排序求逆序对。就是一种cdq分治的应用。
cdq分治
考虑把区间分成左右两边分治
并且考虑左边对于右边的影响。
假如有一个有修改有查询的操作序列。
要用CDQ分治处理
就可以分成左右两部分。
分治完左边,把左边对右边产生影响的东西单独抽出来,计算对右边的贡献。
再分治右边
CDQ分治的应用
二维偏序
给定N个有序数对(a,b),求对于每个(a,b),满足a0< a且b0< b的有序数对(a0,b0)有多少个
这类问题通常是先把(a,b)按a排好序。以把问题进行问题降维。
接着就像归并排序求逆序对一样,通过不断对b归并来计算答案。
三维偏序
给定N个有序数对(a,b,c)求对于每个 (a,b,c),满足a0 < a且b0 < b且c0 < c的有序数对(a0,b0)有多少个。
是不是特别像二维偏序?
通常这类问题是一个二维偏序套线段树实现的。
四维以上的本博客均不介绍。