赤果果的kdTree。

学习传送门:http://www.cnblogs.com/v-July-v/archive/2012/11/20/3125419.html

其实就是二叉树的变形

#include<bits/stdc++.h>
using namespace std;
const int maxn = 5e4+,K = ; #define squ(x) ((x)*(x)) int k,n,idx; struct Point
{
int x[K];
bool operator <(const Point& rhs) const{
return x[idx] < rhs.x[idx];
}
void print() const {
for(int i = ; i < k-; i++)
printf("%d ",x[i]);
printf("%d\n",x[k-]);
}
}P[maxn]; #define fi first
#define se second
typedef pair<double,Point> HeapNode;
priority_queue<HeapNode> q; struct kdTree
{
Point Node[maxn<<];
int son[maxn<<];
#define lch (rt<<1)
#define rch (rt<<1|1) void build(int l,int r,int rt = ,int dep = )
{
if(l>r) return;
son[rt] = r-l;
int x = lch,y = rch;
son[x] = son[y] = -;
idx = dep%k;
int mid = (l+r)>>;
nth_element(P+l,P+mid,P+r+);
Node[rt] = P[mid];
build(l,mid-,x,dep+);
build(mid+,r,y,dep+);
} Point qp; int qm;
void query(int rt = ,int dep = )
{
if(!~son[rt]) return;
HeapNode u(,Node[rt]);
for(int i = ; i < k; i++)
u.fi += squ(u.se.x[i]-qp.x[i]); int dim = dep%k, x = lch, y = rch;
bool flag = false;
if(qp.x[dim]>=Node[rt].x[dim]) swap(x,y);
if(~son[x]) query(x,dep+);
if(q.size()<qm) q.push(u),flag = true;
else {
if(u.fi<q.top().fi) q.pop(),q.push(u);
if(squ(qp.x[dim]-Node[rt].x[dim])<q.top().fi) flag = true;
}
if(flag&&~son[y]) query(y,dep+);
}
}kd; const int M = ;
Point ans[M]; int main()
{
// freopen("in.txt","r",stdin);
while(~scanf("%d%d",&n,&k)){
for(int i = ; i < n; i++)
for(int j = ; j < k; j++)
scanf("%d",&P[i].x[j]);
kd.build(,n-);
int t; scanf("%d",&t);
while(t--){
for(int i = ; i < k; i++) scanf("%d",&kd.qp.x[i]);
scanf("%d",&kd.qm);
kd.query();
printf("the closest %d points are:\n",kd.qm);
int top = ;
while(q.size()){
ans[++top] = q.top().se;
q.pop();
}
while(top){
ans[top].print();
top--;
}
}
}
return ;
}

最新文章

  1. jquery和Js的区别和基础操作
  2. R语言绘制空间热力图
  3. Spring注入方式及注解配置
  4. 排列组合算法(PHP)
  5. 路由知识之ip route 命令中的疑惑
  6. kali linux 渗透测试视频教程 第五课 社会工程学工具集
  7. 20145233韩昊辰 《Java程序设计》实验报告一:Java开发环境的熟悉(Windows+IDEA)
  8. linux定时
  9. HTML中解决双击会选中文本的问题
  10. A Tour of Go Images
  11. #include&lt; &gt;和#include""的区别
  12. C# ORM—Entity Framework 之Code first(代码优先)(二)
  13. ASCII、ANSI、GB2312、Unicode、UTF-8之间的关系
  14. SRM 20
  15. 你还在为如何区分ASCII编码、GB2312编码、Unicod、UTF-8编码而烦恼吗,一篇文章让你柳暗花明
  16. 关于栈、队列、优先队列的应用——UVa11995
  17. 项目中使用sass,如何实现自动编译
  18. windows下python2和python3同时安装ipython
  19. JavaScript -- Window-Resize
  20. jquery里操作json相关的方法和实例

热门文章

  1. PHP实用小程序(一)
  2. Visual Studio 2010下WorldWind编译问题集合
  3. ASP.NET学习笔记(一)相关概念
  4. Git的使用方法与GitHub项目托管方法
  5. AFN的使用
  6. PJzhang:尽快发现并下架那些侵犯公司权利的假冒APP
  7. noip2017普及组
  8. wordcloud 的常规方法
  9. 执行gulp build报错
  10. IDEA 快捷键MacOS