CDQ分治(cdq orz

没想到有一天我这样的菜鸡也会学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];
}
上一篇:【转】Java 8 中 Map 骚操作之 merge() 的用法


下一篇:leetcode 88.合并两个有序数组