CDQ分治学习笔记
数据结构中的一块内容:$CDQ$分治算法。 $CDQ$显然是一个人的名字,陈丹琪(NOI2008金牌女选手) 这种离线分治算法被算法界称为"cdq分治" 我们知道,一个动态的问题一定是由"更改""查询"操作构成的,显然,有些“更改”会改变"查询的结果",而有些不能 如果我们合理安排一个次序,把每一个查询分成几个部分,分别计算值,最后合起来就是原来询问的值。 离线算法和在线算法的概念不用过多解释. 接下来通过几个例题将基本的$CDQ$分治算法解释明白. A. 从逆序对开始的 二维偏序 问题 下面将给出逆序对的题目: 例题·A1: 逆序对的定义是对于序列a[],取第$l$个元素和第$r$个元素,满足$l <r$且$a[l]>a[r]$,对于这样数对$(l,r)$被称为一对逆序对 求解给定序列a中有多少对逆序对,你需要输出对数. 对于100%的数据 $a \leq 5 \times 10^5 $ 我们都知道可以用树状数组和归并排序两种方法做,这里我们只讲归并排序(默认树状数组大家都会) 不断把$[l,r]$细分,每次取$mid=\frac{l+r}{2}$ 然后指针$i$和$j$分别指向区间$[l,mid]$和$[mid+1,r]$并且单调 先确定$i$不动,把$j$右移归并,如果满足$a[i]>a[j]$记录逆序对个数加$mid-i+1$意味着a[i],$i \in [i,mid]$和