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-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Deve

    以上错误是因为安装了 xcode , 但并不是系统默认的位置, 所以可以使用以下命令把 xcode 的路径修改为你安装的位置即可 sudo xcode-select --switch /Applica ...

  2. HTML的Get方法URL传递中文参数,解决乱码问题

    本例中有使用JQuery. 资料参考:http://www.cnblogs.com/babycool/p/3169058.html 发送的HTML页面代码: <!DOCTYPE html> ...

  3. 10.8 noip模拟试题

      1.花 (flower.cpp/c/pas) [问题描述] 商店里出售n种不同品种的花.为了装饰桌面,你打算买m支花回家.你觉得放两支一样的花很难看,因此每种品种的花最多买1支.求总共有几种不同的 ...

  4. 获取服务器端ip

    System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]

  5. [原创] SQLite数据库使用清单(下)

    上文两章对SQLite的功能.语法.和操作进行了介绍,本文讲解SQLite的一些高级语法和操作. 3.

  6. Java排序8大算法实现

    概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大, ...

  7. Alljoyn 概述(3)

    开发工具 • scons:一个 Python写的自动化构建工具,是对 gnu make 改进的替代工具 • D-Feet:一个D-Bus调试工具 • C++ Code Generator Tool ( ...

  8. Html禁止粘贴 复制 剪切

    oncopy="return false;" onpaste="return false;" oncut="return false;"

  9. 『重构--改善既有代码的设计』读书笔记----Introduce Local Extension

    同Introduce Foreign Method一样,很多时候你不能修改编辑原始类,你需要为这些服务类增加一些额外的函数,但你没有这个权限或者入口.如果你只需要一个或者两个外加函数那么你可以放心的使 ...

  10. linux如何开机以命令行形式启动?

    在管理员权限下,修改/etc/inittab文件即可.把id:5:initdefault:改为id:3:initdefault:就可以了. 如下图所示: 图1: . 图2: