cdq分治
cdq分治
其大致形式为
- 递归左右半边
- 考虑左半边对右半边的影响
二维偏序(归并排序):
计算数对 \((i,j)\) 满足 \(a_i<a_j\) 并且 \(b_i<b_j\) 的数对数量
先以 \(a_i\) 排序,这样条件被转换为 \(i<j\) 且 \(b_i<b_j\)
考虑cdq分治
先递归左右半边
对左右两边各开一个指针,若 \(b_i<b_j\) 则\(\text{cnt++}\) ,把 \(i\) 放入一个新数组,否则 \(\text{ans+=cnt}\) 把 \(j\) 放入
把原数组用新数组替换,回溯
复杂度 \(O(n\text{log}n)\)
三维偏序
计算数对 \((i,j)\) 满足 \(a_i<a_j\) 且 \(b_i<b_j\) 且 \(c_i<c_j\) 的数对数量
先以 \(a_i\) 排序,这样条件被转换为 \(i<j\) 且 \(b_i<b_j\) 且 \(c_i<c_j\)
先递归左右半边
对左右两边各开一个指针,若 \(b_i<b_j\) 则把 \(i\) 放入一个新数组,否则把 \(j\) 放入,并打一个标记
把原数组用新数组替换,并对 \(c_i\) 其做二维偏序
回溯
用途
对一些需要修改的题,把时间看成新的一维,然后三维偏序