CDQ分治总结
快速解决三位偏序问题的算法
模板题题意:每个a[i],b[i],c[i],问对于每个i,有多少个j,使得a[j]<=a[i],b[j]<=b[i],c[j]<=c[i](j!=i)
做法:排序+归并排序+树状数组
要保证计算答案时,三维都是符合条件的,排序-》a,归并排序-》b,树状数组-》c
归并排序时,合并的两个区间已经关于b分别有序,只需考虑c了。用双指针算法,树状数组动态存储每个i对应的左区间数量。最后把树状数组清空
用到树状数组动态维护前缀最大值:
inline void clear(int x){
for(int i=x;i<=n;i+=lowbit(i)){
tr[i]=0;
}
}//清空操作
把另外三个区间对称到二三四象限(横纵坐标乘-1即可),之后就都转化成了求前缀最大值的情况,就可以用CDQ分治了
浙公网安备 33010602011771号