kdtree可以過
K-D Tree第一題。唉,人生若只如初見......
這道題考察的是K-D Tree在最近鄰搜索方面的應用。很顯然,對於黑棋,加入到K-D Tree裡;對於白棋,詢問最近鄰。
下面寫一些自己關於這道題的理解吧:
1.K-D Tree本質上是一種DFS的剪枝優化。
2.每一層對應的區分維度是循環的。由於這道題只有兩維,所以可以利用位運算的抑或操作。
3.在每一層的DFS中,有一個get函數,相當於估計了子區域距離那個點最近是多少,注意是估計。下一次的DFS就從dl和dr中較小的一邊開始。感覺方法還是很巧妙的。
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<algorithm> #define F(i,j,n) for(int i=j;i<=n;i++) #define D(i,j,n) for(int i=j;i>=n;i--) #define ll long long #define maxn 500005 #define inf 1000000000 using namespace std; int n,m,root,D,ans; struct data { int d[2],mn[2],mx[2],l,r; }p[maxn],t[maxn*2],tmp; bool operator<(data a,data b) { return a.d[D]<b.d[d]; ch="" inline="" int="" while="" x="0,f=1;char">'9'){if (ch=='-') f=-1;ch=getchar();} while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } inline int dis(data a,data b) { return abs(a.d[0]-b.d[0])+abs(a.d[1]-b.d[1]); } inline void pushup(int k) { int ls=t[k].l,rs=t[k].r; F(i,0,1) { if (ls) { t[k].mn[i]=min(t[k].mn[i],t[ls].mn[i]); t[k].mx[i]=max(t[k].mx[i],t[ls].mx[i]); } if (rs) { t[k].mn[i]=min(t[k].mn[i],t[rs].mn[i]); t[k].mx[i]=max(t[k].mx[i],t[rs].mx[i]); } } } inline int build(int l,int r,int now) { D=now; int mid=(l+r)>>1; nth_element(p+l,p+mid,p+r+1); t[mid]=p[mid]; F(i,0,1) t[mid].mn[i]=t[mid].mx[i]=t[mid].d[i]; if (l<mid) .l="build(l,mid-1,now^1);" .r="build(mid+1,r,now^1);" data="" if="" inline="" int="" return="" tmp="0;" void="">=t[k].d[now]) { if (t[k].r) insert(t[k].r,now^1); else { t[k].r=++n;t[n]=tmp; F(i,0,1) t[n].mn[i]=t[n].mx[i]=t[n].d[i]; } } else { if (t[k].l) insert(t[k].l,now^1); else { t[k].l=++n;t[n]=tmp; F(i,0,1) t[n].mn[i]=t[n].mx[i]=t[n].d[i]; } } pushup(k); } inline void query(int k,int now) { int d,dl=inf,dr=inf; d=dis(t[k],tmp); ans=min(ans,d); if (t[k].l) dl=get(t[k].l,tmp); if (t[k].r) dr=get(t[k].r,tmp); if (dl<dr) .l="p[i].r=0;p[i].d[0]=read();p[i].d[1]=read();}" ans="inf;" else="" if="" int="" n="read();m=read();" opt="=1)" pre="" return="" root="build(1,n,0);" tmp.l="tmp.r=0;" while=""><p> </p> </dr)></mid)></b.d[d];></algorithm></cstdlib></cmath></cstring></cstdio></iostream>