kdtree讲解:
https://blog.csdn.net/qing101hua/article/details/53228668
https://blog.csdn.net/acdreamers/article/details/44664645
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4347
给你一堆点,每次查询给一个点求和这个点最近的m个点是什么(距离是欧氏距离)
裸的kdtree

//#pragma comment(linker, "/stack:200000000") //#pragma GCC optimize("Ofast,no-stack-protector") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") //#pragma GCC optimize("unroll-loops") #include<bits/stdc++.h> #define fi first #define se second #define mp make_pair #define pb push_back #define pi acos(-1.0) #define ll long long #define vi vector<int> #define mod 1000000007 #define C 0.5772156649 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #define pil pair<int,ll> #define pli pair<ll,int> #define pii pair<int,int> #define cd complex<double> #define ull unsigned long long #define base 1000000000000000000 #define fio ios::sync_with_stdio(false);cin.tie(0) using namespace std; const double g=10.0,eps=1e-8; const int N=50000+10,maxn=5000+10,inf=0x3f3f3f3f,INF=0x3f3f3f3f3f3f3f3f; int n,k,idx; struct node{ int f[5]; bool operator <(const node&rhs)const{ return f[idx]<rhs.f[idx]; } }a[N]; priority_queue<pair<double,node> >q; struct kdtree{ bool vis[N<<2]; node date[N<<2]; void build(int l,int r,int rt,int dep) { if(l>r)return ; vis[rt]=1; vis[rt<<1]=vis[rt<<1|1]=0; idx=dep%k; int m=(l+r)>>1; nth_element(a+l,a+m,a+r+1); date[rt]=a[m]; build(l,m-1,rt<<1,dep+1); build(m+1,r,rt<<1|1,dep+1); } void query(node p,int m,int rt,int dep) { if(!vis[rt])return ; printf("%d ",rt); pair<double,node>cur(0,date[rt]); for(int i=0;i<k;i++) cur.fi+=(cur.se.f[i]-p.f[i])*(cur.se.f[i]-p.f[i]); int dim=dep%k; bool fg=0; int x=rt<<1,y=rt<<1|1; if(p.f[dim]>=date[rt].f[dim])swap(x,y); if(vis[x])query(p,m,x,dep+1); if(q.size()<m)q.push(cur),fg=1; else { if(cur.fi<q.top().fi) { q.pop();q.push(cur); } if((p.f[dim]-date[rt].f[dim])*(p.f[dim]-date[rt].f[dim])<q.top().fi)fg=1; } if(vis[y]&&fg)query(p,m,y,dep+1); } }kd; int main() { while(scanf("%d%d",&n,&k)!=EOF) { for(int i=0;i<n;i++) for(int j=0;j<k;j++) scanf("%d",&a[i].f[j]); kd.build(0,n-1,1,0); int t;scanf("%d",&t); while(t--) { node p; for(int i=0;i<k;i++)scanf("%d",&p.f[i]); int m;scanf("%d",&m); while(!q.empty())q.pop(); // printf("%d ",idx); kd.query(p,m,1,0); printf("the closest %d points are: ",m); node ans[25]; for(int i=0;!q.empty();i++)ans[i]=q.top().se,q.pop(); for(int i=m-1;i>=0;i--) for(int j=0;j<k;j++) printf("%d%c",ans[i].f[j],j==k-1?' ':' '); } } return 0; } /*********************** ***********************/