CDQ分治与分治
将一个O(n2)优化为O(n log n)。
一般来说当我们n2暴力枚举所有元素对时,会发现有的元素对对ans没有贡献,是多余的,无用的,冗杂的。
所以我们需要选择与计算一些初步判断下对ans更可能有贡献的元素对。
CDQ分治与分治便是一种优化方式,重点便是同级区间的优秀合并。
例题:P7883 平面最近点对(分治)
大意:在平面上找到两个最接近的点。(n<=1e5)
暴力枚举每一个点对显然会超时,从暴力考虑优化会发现,对于点对(x1,y1),(x2,y2),
d(当前已求到的最近的两点的距离),只考虑|x1-x2|<=d且|y1-y2|<=d的点对。
使用分治则是二分对于每一个mid左右扩展。
分治与CDQ分治的区别:
分治:同级区间之间互相没有联系。
CDQ分治:同级区间之间可能会有联系。
模板:
void merge(int l,int r){
int mid=l+r>>1;
if(l>=r) return ;
merge(l,mid),merge(mid+1,r);
/*
合并部分
*/
}