CDQ分治学习

CDQ分治学习

声明:此算法不适用于强制在线题。

一切是从归并排序求逆序对开始的。
我们先假装已经分治完左边和右边,又回溯到了某一处
CDQ分治学习_第1张图片这里写图片描述
现在我们要合并了
CDQ分治学习_第2张图片
左边和右边的答案已经算完
考虑跨越mid的逆序对的个数
注意到逆序对的定义,  i<jai>aj   i < j a i > a j
首先  i<j   i < j 是肯定可以保证的
所以需要考虑的仅仅是  ai>aj   a i > a j
做到这一点应该不难。

接下来引出简单又自然的CDQ分治

刚刚的归并排序求逆序对。就是一种cdq分治的应用。
cdq分治
考虑把区间分成左右两边分治
并且考虑左边对于右边的影响。
这里写图片描述
假如有一个有修改有查询的操作序列。
要用CDQ分治处理
就可以分成左右两部分。
这里写图片描述
分治完左边,把左边对右边产生影响的东西单独抽出来,计算对右边的贡献。
CDQ分治学习_第3张图片
再分治右边这里写图片描述

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)有多少个。
是不是特别像二维偏序?
通常这类问题是一个二维偏序套线段树实现的。

四维以上的本博客均不介绍。

你可能感兴趣的:(分治)