复习一下kd-tree模板,顺便学点新东西。
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<iostream> #include<queue> #define maxn 100010 using namespace std; int cur; struct yts1 { long long dis; int id; }; bool operator<(yts1 x,yts1 y) { return x.dis>y.dis || (x.dis==y.dis && x.id<y.id); } struct yts { long long d[2],mx[2],mn[2],lch,rch; int id; long long& operator[](int x) {return d[x];} friend bool operator< (yts x,yts y) {return x[cur]<y[cur];} friend long long dis(yts x,yts y) {return (x[0]-y[0])*(x[0]-y[0])+(x[1]-y[1])*(x[1]-y[1]);} }t[maxn],p[maxn],T; int n,m,root,k; void update(int x) { int l=t[x].lch,r=t[x].rch; for (int i=0;i<2;i++) { t[x].mx[i]=t[x].mn[i]=t[x][i]; if (l) t[x].mx[i]=max(t[x].mx[i],t[l].mx[i]); if (r) t[x].mx[i]=max(t[x].mx[i],t[r].mx[i]); if (l) t[x].mn[i]=min(t[x].mn[i],t[l].mn[i]); if (r) t[x].mn[i]=min(t[x].mn[i],t[r].mn[i]); } } int build_tree(int l,int r,int now) { cur=now; int mid=(l+r)/2; nth_element(p+l,p+mid,p+r+1); t[mid]=p[mid]; if (l<mid) t[mid].lch=build_tree(l,mid-1,now^1); if (mid<r) t[mid].rch=build_tree(mid+1,r,now^1); update(mid); return mid; } priority_queue<yts1> q; long long get_mx(int x) { long long ans=0; for (int i=0;i<=1;i++) ans+=max((t[x].mx[i]-T[i])*(t[x].mx[i]-T[i]),(t[x].mn[i]-T[i])*(t[x].mn[i]-T[i])); return ans; } void query(int x) { yts1 P,Q; P.dis=dis(t[x],T);P.id=t[x].id; Q=q.top(); if (Q.dis<P.dis || (Q.dis==P.dis && Q.id>P.id)) q.pop(),q.push(P); int l=t[x].lch,r=t[x].rch; long long dl=-2,dr=-2; if (l) dl=get_mx(l); if (r) dr=get_mx(r); if (dl>dr) { if (dl>=(q.top()).dis) query(l); if (dr>=(q.top()).dis) query(r); } else { if (dr>=(q.top()).dis) query(r); if (dl>=(q.top()).dis) query(l); } } int main() { scanf("%d",&n); for (int i=1;i<=n;i++) {scanf("%lld%lld",&p[i][0],&p[i][1]);p[i].id=i;} root=build_tree(1,n,0); scanf("%d",&m); while (m--) { scanf("%lld%lld%d",&T[0],&T[1],&k); while (!q.empty()) q.pop(); yts1 x;x.dis=-1;x.id=0; for (int i=1;i<=k;i++) q.push(x); query(root); printf("%d\n",(q.top()).id); // while (!q.empty()) {printf("%d %lld\n",(q.top()).id,(q.top()).dis);q.pop();} } return 0; }