Kdtree template, find the nearest K point in M-dimensional space, using Euclidean distance.
Understand for a long time, last night always do not understand those "valuation function", later only to know the sub-situation discussion, ≤k or =k, in the current dimension of the distance over the line or line, the line will continue to search another subtree. And don't forget the current node!
#include <cmath> #include <queue> #include <cstdio> #include <cstring> #include <algorithm > #define READ (x) X=getint () using namespace std;typedef long long ll;const int N = 50003;const int inf = 0x7fffffff;int Getint () {int k = 0, fh = 1; char c = GetChar (); for (C < ' 0 ' | | c > ' 9 '; c = GetChar ()) if (c = = '-') FH = -1;for (; C >= ' 0 ' && C <= ' 9 '; c = GetChar ()) K = k * + C-' 0 '; return k * FH; int n, m, Root, D; LL minn;struct P {int d[5], mx[5], mn[5], L, R, id; P (): L (0), R (0), ID (0) {};int &operator [] (int x) {return d[x];} BOOL Operator < (P point) const {return d[d] < point[d];}} T[n << 1], po[n];p riority_queue <pair <ll, int> > Q; ll Sqr (ll x) {return x * x;} ll DIS (p a, p b) {LL ret = 0;for (int i = 0; i < m; ++i) ret + = SQR (A[i]-b[i]); return ret;} void pushup (int x, int y) {for (int i = 0; i < m; ++i) t[x].mn[i] = min (T[x].mn[i], t[y].mn[i]), t[x].mx[i] = max (t[x].mx[ I], t[y].mx[i]);} int Build (int l, int r, inT dd) {D = dd; int mid = (L + r) >> 1; nth_element (PO + L, PO + Mid, Po + R + 1); for (int i = 0; i < m; ++i) T[mid] . mn[i] = t[mid].mx[i] = T[mid].d[i] = Po[mid].d[i]; T[mid].id = Mid;if (L < mid) T[mid].l = Build (L, Mid-1, (dd + 1)% m), if (Mid < r) T[MID].R = Build (mid + 1, R, (d D + 1)% m), if (T[MID].L) pushup (Mid, T[MID].L), if (T[MID].R) pushup (Mid, T[MID].R); return mid;} void Ask (int rt, int dd, p p, int k) {int L = T[RT].L, r = t[rt].r;if (P[dd] >= t[rt][dd]) swap (L, R), if (l) Ask (L, (DD + 1)% m, p, K); bool pd = 0; LL di = Dis (t[rt], p); Minn = MIN (minn, di), if (Q.size () < K) {Q.push (pair <ll, int> (di, RT)); PD = 1;} else {if (Di < Q.top (). First) Q.pop (), Q.push (Make_pair (DI, RT)), if (Sqr (P[DD]-T[RT][DD]) < Q.top (). First) PD = 1; }if (PD && R) Ask (R, (dd + 1)% m, p, K);} int Ans[n];int Main () {while (~scanf ("%d%d", &n, &m)) {for (int i = 1; I <= N; ++i) for (int j = 0; j < m; ++j) Read (Po[i][j]); memset (t, 0, sizeof (t)); root = BuiLD (1, n, 0); int qq; Read (QQ), for (; QQ;--qq) {p p; int k;for (int i = 0; i < m; ++i) read (p[i]); Read (k);p rintf ("The closest%d points are:\n" , k); minn = inf; Ask (root, 0, p, K); while (! Q.empty ()) {ans[++ans[0]] = Q.top (). Second; Q.pop ();} for (; ans[0];--ans[0]) for (int i = 0; i < m; ++i) printf ("%d%c", t[ans[ans[0]]][i], "\ n" [i = M-1]);}} return 0;}
I am weak ah ~ ~ ~
"Bzoj 3053" the Closest M Points