With p2626. Because k is small, you do not need to use heaps.
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm>using namespace std; typedef double DB; #define N 50001#define INF 2147483647.0#define KD 5//èêýint qp[kd];int n,root,kd,k;int dn;struct Ans{ int P[KD]; DB D;} Ans[10];int sqr (const int &x) {return x*x;} struct node{int MINN[KD],MAXX[KD],P[KD]; int ch[2]; void Init () {for (int i=0;i<kd;++i) minn[i]=maxx[i]=p[i]; } db Dis () {db t=0; for (int i=0;i<kd;++i) {t+= (db) Sqr (Max (0,minn[i]-qp[i])); t+= (db) Sqr (Max (0,qp[i]-maxx[i])); } return sqrt (t); }}t[n<<1];void Update (int rt) {for (Int. i=0;i<2;++i) if (T[rt].ch[i]) for (int j=0;j<kd;++j) {t[rt].minn[j]=min (t[rt].minn[j],t[t[rt].ch[i]].minn[j]); T[rt].maxx[j]=max (T[rt].maxx[j],t[t[rt].ch[i]].maxx[j]); }}DB Dis (int a[],int b[]) {db t=0; for (int i=0;i<kd;++i) t+= (db) Sqr (A[i]-b[i]); return sqrt (t);} BOOL operator < (const node &a,const node &b) {return A.P[DN]<B.P[DN];} int buildtree (int l=1,int r=n,int d=0) {dn=d; int m= (l+r>>1); Nth_element (t+l,t+m,t+r+1); T[M]. Init (); if (l!=m) T[m].ch[0]=buildtree (L,m-1, (d+1)%KD); if (m!=r) T[m].ch[1]=buildtree (M+1,r, (d+1)%KD); Update (m); return m;} void Query (int rt=root) {db T=dis (T[RT].P,QP); for (int i=0;i<k;++i) if (T<ANS[I].D) {for (int j=k-1;j>=i+1;--j) ans[j]=ans[j-1]; ans[i].d=t; memcpy (ans[i].p,t[rt].p,sizeof (T[RT].P)); Break } DB dd[2]; for (int i=0;i<2;i++) if (T[rt].ch[i]) dd[i]=t[t[rt].ch[i]]. Dis (); else Dd[i]=inf; BOOL F= (dd[0]<=dd[1]); if (dd[!f]<ans[k-1].d && t[rt].ch[!f]) Query (t[rt].ch[!f]); if (dd[f]<ans[k-1].d && t[rt].ch[f]) Query (t[rt].ch[f]);} int Q;int Main () {//Freopen ("Bzoj3053.in", "R", stdin);//FreOpen ("Bzoj3053.out", "w", stdout); while (scanf ("%d%d", &N,&KD)!=eof) {for (Int. i=1;i<=n;++i) for (int j=0;j<kd;++j) scanf ("%d", &t[i].p[j]); Buildtree (); Root= (1+n>>1); scanf ("%d", &q); for (; q;--q) {for (int i=0;i<kd;++i) scanf ("%d", &qp[i]); scanf ("%d", &k); for (int i=0;i<k;++i) Ans[i].d=inf; Query (); printf ("The closest%d points are:\n", K); for (int i=0;i<k;++i) {for (int j=0;j<kd-1;++j) printf ("%d", Ans[i].p[j] ); printf ("%d\n", ans[i].p[kd-1]); }} for (int i=1;i<=n;++i) t[i].ch[0]=t[i].ch[1]=0; } return 0;}
"Kd-tree" bzoj3053 the Closest M Points