The Closest M Points

Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 98304/98304 K (Java/Others)
Total Submission(s): 3285    Accepted Submission(s): 1201

Problem Description
The
course of Software Design and Development Practice is objectionable.
ZLC is facing a serious problem .There are many points in K-dimensional
space .Given a point. ZLC need to find out the closest m points.
Euclidean distance is used as the distance metric between two points.
The Euclidean distance between points p and q is the length of the line
segment connecting them.In Cartesian coordinates, if p = (p1, p2,..., pn) and q = (q1, q2,..., qn) are two points in Euclidean n-space, then the distance from p to q, or from q to p is given by:

Can you help him solve this problem?
 
Input
In
the first line of the text file .there are two non-negative integers n
and K. They denote respectively: the number of points, 1 <= n <=
50000, and the number of Dimensions,1 <= K <= 5. In each of the
following n lines there is written k integers, representing the
coordinates of a point. This followed by a line with one positive
integer t, representing the number of queries,1 <= t <=10000.each
query contains two lines. The k integers in the first line represent the
given point. In the second line, there is one integer m, the number of
closest points you should find,1 <= m <=10. The absolute value of
all the coordinates will not be more than 10000.
There are multiple test cases. Process to end of file.
 
Output
For each query, output m+1 lines:
The first line saying :”the closest m points are:” where m is the number of the points.
The following m lines representing m points ,in accordance with the order from near to far
It
is guaranteed that the answer can only be formed in one ways. The
distances from the given point to all the nearest m+1 points are
different. That means input like this:
2 2
1 1
3 3
1
2 2
1
will not exist.
 
Sample Input
3 2
1 1
1 3
3 4
2
2 3
2
2 3
1
 
Sample Output
the closest 2 points are:
1 3
3 4
the closest 1 points are:
1 3
  
  绳命中第一道KD树,模板题,照着打的。
  难道————KD树==剪枝?嗯,我再想想~~
 #include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
const int maxn=;
int cmpNo,K;
struct Node{
int x[],l,r,id;
bool operator <(const Node &b)const{
return x[cmpNo]<b.x[cmpNo];
}
}; long long Dis(const Node &a,const Node &b){
long long ret=;
for(int i=;i<K;i++)
ret+=(a.x[i]-b.x[i])*(a.x[i]-b.x[i]);
return ret;
} Node p[maxn]; int Build(int l,int r,int d){
if(l>r)return ;
cmpNo=d;
int mid=l+r>>;
nth_element(p+l,p+mid,p+r+);
p[mid].l=Build(l,mid-,(d+)%K);
p[mid].r=Build(mid+,r,(d+)%K);
return mid;
} priority_queue<pair<long long,int> >q;
void Kth(int l,int r,Node tar,int k,int d){
if(l>r)return;
int mid=l+r>>;
pair<long long,int>v=make_pair(Dis(p[mid],tar),p[mid].id);
if(q.size()==k&&v<q.top())q.pop();
if(q.size()<k)q.push(v);
long long t=tar.x[d]-p[mid].x[d];
if(t<=){
Kth(l,mid-,tar,k,(d+)%K);
if(q.top().first>t*t)
Kth(mid+,r,tar,k,(d+)%K);
}
else{
Kth(mid+,r,tar,k,(d+)%K);
if(q.top().first>t*t)
Kth(l,mid-,tar,k,(d+)%K);
}
}
int k,ans[];
Node a[maxn];
int main(){
int n;
while(scanf("%d%d",&n,&K)!=EOF){
for(int id=;id<=n;id++){
for(int i=;i<K;i++)
scanf("%d",&p[id].x[i]);
p[id].id=id;
a[id]=p[id];
}
Build(,n,);
int Q,tot;
scanf("%d",&Q);
Node tar;
while(Q--){
for(int i=;i<K;i++)
scanf("%d",&tar.x[i]);
scanf("%d",&k);
printf("the closest %d points are:\n",k);
for(int i=;i<=k;i++)q.push(make_pair(1e18,-));
Kth(,n,tar,k,);tot=;
while(!q.empty()){
int id=(q.top()).second;q.pop();
ans[tot++]=id;
}
for(int i=tot-;i>=;i--)
for(int j=;j<K;j++)
printf("%d%c",a[ans[i]].x[j],j==K-?'\n':' ');
}
}
return ;
}
 

数据结构(KD树):HDU 4347 The Closest M Points的更多相关文章

  1. bzoj 3053 HDU 4347 : The Closest M Points kd树

    bzoj 3053 HDU 4347 : The Closest M Points  kd树 题目大意:求k维空间内某点的前k近的点. 就是一般的kd树,根据实测发现,kd树的两种建树方式,即按照方差 ...

  2. hdu 4347 The Closest M Points (kd树)

    版权声明:本文为博主原创文章,未经博主允许不得转载. hdu 4347 题意: 求k维空间中离所给点最近的m个点,并按顺序输出  . 解法: kd树模板题 . 不懂kd树的可以先看看这个 . 不多说, ...

  3. hdu 4347 The Closest M Points(KD树)

    Problem - 4347 一道KNN的题.直接用kd树加上一个暴力更新就撸过去了.写的时候有一个错误就是搜索一边子树的时候返回有当前层数会被改变了,然后就直接判断搜索另一边子树,搞到wa了半天. ...

  4. HDU 4347 - The Closest M Points - [KDTree模板题]

    本文参考: https://www.cnblogs.com/GerynOhenz/p/8727415.html kuangbin的ACM模板(新) 题目链接:http://acm.hdu.edu.cn ...

  5. HDU 4347 The Closest M Points (kdTree)

    赤果果的kdTree. 学习传送门:http://www.cnblogs.com/v-July-v/archive/2012/11/20/3125419.html 其实就是二叉树的变形 #includ ...

  6. 【HDOJ】4347 The Closest M Points

    居然是KD解. /* 4347 */ #include <iostream> #include <sstream> #include <string> #inclu ...

  7. hud 4347 The Closest M Points(KD-Tree)

    传送门 解题思路 \(KD-Tree\)模板题,\(KD-Tree\)解决的是多维问题,它是一个可以储存\(K\)维数据的二叉树,每一层都被一维所分割.它的插入删除复杂度为\(log^2 n\),它查 ...

  8. KD树的极简单笔记(待后续更新)

    今天(18.5.4)室友A突然问我算法怎么入门,兴奋之下给他安利了邓公的<数据结构>,然而他接着又问我能不能两周内快速入门,毕竟打算搞Machine Learning,然后掏出手机看了下他 ...

  9. K-D树问题 HDU 4347

    K-D树可以看看这个博客写的真心不错!这里存个版 http://blog.csdn.net/zhjchengfeng5/article/details/7855241 HDU 4349 #includ ...

随机推荐

  1. xcode 6.4模拟器出现多个相同版本:OSX Yosemite 上安装xcode7 beta和xcode6.4

    错误现象是:我在OSX Yosemite上同时安装了Xcode 7Beta和Xcode 6.4,然后Xcode 6.4的模拟器出现了重复版本.截图如下: 解决方法是: 删除该路径下的所有文件:~/Li ...

  2. linux的openfire运行日志配置经历

    openfire的日志可以通过/usr/openfire/lib/log4j.xml(与openfire的安装目录有关,我的openfire是安装在/usr/openfire/)的xml配置文件进行设 ...

  3. Java使用poi对Execl简单操作_总结

    poi是Apache组织给开发者提供一套操作office(Execl,Word,PowerPoint)等Java API,开发者通过Poi API可以快速的操作office办公软件,以上3篇博文只是一 ...

  4. Android开发---支付宝功能接口(支付功能)(转载!)

    最近在做一个关于购物商城的项目,项目里面付款这块我选的是调用支付宝的接口,因为用的人比较多. 在网上搜索了以下,有很多这方面的教程,但大部分教程过于陈旧,而且描述的过于简单.而且支付宝提供的接口一直在 ...

  5. Solaris用户管理(一):用户与组管理

    Solaris用户管理(一):用户与组管理  2008-07-01 09:19 用户管理是系统管理的基础.Solaris中不但支持传统Unix所支持的用户和组的概念,还从Solaris 8开始引入了基 ...

  6. iOS LaunchScreen设置启动图片,启动页停留时间

    [新建的iOS 项目启动画面默认为LaunchScreen.xib] 如果想实现一张图片作为启动页,如下图

  7. c++实现的Array数据结构

    1.Array.h,Array<T>的定义 template <class T> class Array { protected: T *data; //一个指向数组数据的指针 ...

  8. 【HDU3802】【降幂大法+矩阵加速+特征方程】Ipad,IPhone

    Problem Description In ACM_DIY, there is one master called “Lost”. As we know he is a “-2Dai”, which ...

  9. 工厂方法模式(Factory Method)

    1.本质:延迟到子类来选择实现 2.示意图: 3.主要功能: 让父类在不知道具体实现的情况下,完成自身功能的调用 类似于注入 4.备注: 1.工厂方法中,通常父类是一个抽象类,里面包含创建对象的抽象工 ...

  10. Perl 中级教程 第5章课后习题

    5. 9. 1. 练习1 [5 分钟] 先不要运行程序, 看看你能否判断出这程序的哪部份出了问题?如果你看不出 来, 就可以运行一相程序, 得到些暗示, 来看是否能修改好: my %passenger ...