没想到有一天我这样的菜鸡也会学CDQ分治
绝大部分内容来自【洛谷日报#115】CDQ分治和整体二分,如有雷同,不是巧合
- CDQ分治是一种基于分治思想的离线算法,能吊打在线解法
前置芝士:分治
- 经典例子:归并排序(逆序对)
- 众所周知,归并排序是每次将区间[l,r]拆分成[l,mid],[mid+1,r],然后再\(O(n)\)合并两个有序数组,再将[l,r]的答案传到上层,可得时间复杂度为\(O(nlogn)\)
void merge_sort(int l,int r){
if(l==r)return ;
int mid=(l+r)>>1;
merge_sort(l,mid);
merge_sort(mid+1,r);
int p=l,q=mid+1,cnt=l;
while(p<=mid&&q<=r)
if(t[p]<=t[q])t[cnt++]=a[p++];
else t[cnt++]=a[q++];
while(p<=mid)
t[cnt++]=a[p++];
while(q<=r)
t[cnt++]=a[q++];
for(int i=l;i<=r;i++)a[i]=t[i];
}