kD-Tree 学习笔记
模板:
int K,root;
struct node{
int ls,rs;
int L[2],U[2];
int v[2];
bool operator<(const node &b)const{
return v[K]<b.v[K];
}
}nd[maxn];
void pushup(int k){
for(int i=0;i<2;i++){
nd[k].L[i]=nd[k].U[i]=nd[k].v[i];
if(nd[k].ls){
nd[k].L[i]=min(nd[k].L[i],nd[nd[k].ls].L[i]);
nd[k].U[i]=max(nd[k].U[i],nd[nd[k].ls].U[i]);
}
if(nd[k].rs){
nd[k].L[i]=min(nd[k].L[i],nd[nd[k].rs].L[i]);
nd[k].U[i]=max(nd[k].U[i],nd[nd[k].rs].U[i]);
}
}
}
int build(int l,int r,int k){
if(l>r)return 0;
int mid=(l+r)>>1;
K=k;
nth_element(nd+l,nd+mid,nd+r+1);
nd[mid].ls=build(l,mid-1,k^1);
nd[mid].rs=build(mid+1,r,k^1);
pushup(mid);
return mid;
}
简述:对于平面上的点集,我们可以分治.
每一次交替寻找 \(x.y\) 的中位数,可以使用 nth_element 函数。这样就可以保证平衡性。
P4148
模板题目,我们考虑建 kD-Tree,当懒插入超过 \(\sqrt{nlog_2n}\) 时 rebuild。
P4169
考虑计算点到矩形的距离。剪枝即可,需要调整根号分治时的 B 。

浙公网安备 33010602011771号