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\) 其做二维偏序

回溯

用途

对一些需要修改的题,把时间看成新的一维,然后三维偏序

posted @ 2024-07-10 15:19  WJChp  阅读(11)  评论(0编辑  收藏  举报