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分治了

posted on 2025-12-21 18:40  yangruixi  阅读(4)  评论(0)    收藏  举报

导航