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

posted @ 2026-01-20 17:27  mo_mo_yu  阅读(1)  评论(0)    收藏  举报