题意

一个k维空间,给出n个点的坐标,给出t个询问,每个询问给出一个点的坐标和一个m。对于每个询问找出跟这个点最接近的m个点

分析

kd树的模板题。

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue> using namespace std;
typedef long long LL;
const int maxn=;
const int K=;
int num,nownum,m;
LL ans;
struct kdNode{
LL x[K];
int div;
bool lef;
}Ans[];
struct Node{
kdNode a;
LL dis;
bool operator <(const Node &a)const{
return dis<a.dis;
}
Node(){}
Node(kdNode &tmp,LL d){
a=tmp;
dis=d;
}
};
int cmpNo;
bool cmp(kdNode a,kdNode b){
return a.x[cmpNo]<b.x[cmpNo];
}
inline LL max(LL a,LL b){//why?
return a>b?a:b;
}
kdNode p[maxn],q;
LL dis(kdNode a,kdNode b,int k){
LL res=;
for(int i=;i<k;i++){
res+=(a.x[i]-b.x[i])*(a.x[i]-b.x[i]);
}
return res;
}
priority_queue<Node>qq;
void buildKD(int l,int r,kdNode* p,int d,int k){
if(l>r)return ;
int m=(l+r)/;
cmpNo=d;
nth_element(p+l,p+m,p+r+,cmp);
p[m].div=d;
if(l==r){
p[m].lef=;
return ;
}
buildKD(l,m-,p,(d+)%k,k);
buildKD(m+,r,p,(d+)%k,k);
}
void findkd(int l,int r,kdNode& tar,kdNode* p,int k){
if(l>r)return;
int m=(l+r)/;
LL d=dis(p[m],tar,k);
if(p[m].lef){
if(nownum<num){
nownum++;
ans=max(ans,d);
qq.push(Node(p[m],d));
}
else if(ans>d){
qq.pop();
qq.push(Node(p[m],d));
ans=qq.top().dis;
}
return;
}
LL t=tar.x[p[m].div]-p[m].x[p[m].div];
if(t>){
findkd(m+,r,tar,p,k);
if(nownum<num){
qq.push(Node(p[m],d));
nownum++;
ans=qq.top().dis;
findkd(l,m-,tar,p,k);
}else{
if(ans>d){
qq.pop();
qq.push(Node(p[m],d));
ans=qq.top().dis;
}
if(ans>t*t)
findkd(l,m-,tar,p,k);
}
}else{
findkd(l,m-,tar,p,k);
if(nownum<num){
qq.push(Node(p[m],d));
nownum++;
ans=qq.top().dis;
findkd(m+,r,tar,p,k);
}else{
if(ans>d){
qq.pop();
qq.push(Node(p[m],d));
ans=qq.top().dis;
}
if(ans>t*t){
findkd(m+,r,tar,p,k);
}
}
}
} int n,k;
int main(){
while(scanf("%d%d",&n,&k)==){
for(int i=;i<n;i++){
for(int j=;j<k;j++){
scanf("%lld",&p[i].x[j]);
}
p[i].lef=;
}
buildKD(,n-,p,k-,k);
int t;
scanf("%d",&t);
for(int i=;i<=t;i++){
ans=-;
nownum=;
for(int j=;j<k;j++){
scanf("%lld",&q.x[j]);
}
while(!qq.empty())qq.pop();
scanf("%d",&num);
findkd(,n-,q,p,k);
for(int j=;j<=num;j++){
Ans[j]=qq.top().a;
qq.pop();
}
printf("the closest %d points are:\n",num);
for(int j=num;j>=;j--){
for(int kk=;kk<k;kk++){
if(kk==)
printf("%lld",Ans[j].x[kk]);
else
printf(" %lld",Ans[j].x[kk]);
}
printf("\n");
}
}
}
return ;
}

【hdu4347】The Closest M Points 【KD树模板】的更多相关文章

  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. [hdu4347]The Closest M Points(线段树形式kd-tree)

    解题关键:kdtree模板题,距离某点最近的m个点. #include<cstdio> #include<cstring> #include<algorithm> ...

  4. [hdu4347]The Closest M Points(平衡树式kdtree)

    解题关键:模板题(结合起来了) #include<iostream> #include<cstdio> #include<cstring> #include< ...

  5. BZOJ3053:The Closest M Points(K-D Teee)

    Description The course of Software Design and Development Practice is objectionable. ZLC is facing a ...

  6. BZOJ 3053: The Closest M Points(K-D Tree)

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1235  Solved: 418[Submit][Status][Discuss] Descripti ...

  7. k-d树模板(BZOJ2648)

    实现了插入一个点,查询距某个位置的最近点. #include <cstdio> #include <algorithm> using namespace std; , inf ...

  8. tju_4147 kd树+最小生成树

    kd树模板+全图最小生成树 标签(空格分隔): kd树+最小生成树 题目链接 题意: k维太空中有n个点,每个点可以与距离它m近的点连边,现在给你一堆点,并给出坐标,现在要建立通信网络,一些可以互相到 ...

  9. HDU 5992 Finding Hotels(KD树)题解

    题意:n家旅店,每个旅店都有坐标x,y,每晚价钱z,m个客人,坐标x,y,钱c,问你每个客人最近且能住进去(非花最少钱)的旅店,一样近的选排名靠前的. 思路:KD树模板题 代码: #include&l ...

随机推荐

  1. Linux中文档去掉windows文本的多余的回车符(^M)

    1) 使用sed   去掉windows下的回车符 (注意^M 在linux 下写法 按^M 是回车换行符,输入方法是按住CTRL+v,松开v,按m) sed -i 's/^M//g' filenam ...

  2. 《DSP using MATLAB》Problem 2.10

    代码: %% ------------------------------------------------------------------------ %% Output Info about ...

  3. 设计模式(Python)-简单工厂,工厂方法和抽象工厂模式

    本系列文章是希望将软件项目中最常见的设计模式用通俗易懂的语言来讲解清楚,并通过Python来实现,每个设计模式都是围绕如下三个问题: 为什么?即为什么要使用这个设计模式,在使用这个模式之前存在什么样的 ...

  4. ambassador 学习一基本试用

    安装使用docker for mac Without RBAC 安装ambassador 安装 kubectl apply -f https://getambassador.io/yaml/ambas ...

  5. Appium Desktop介绍-xcodebuild failed with code 65 问题解决

    Appium Desktop介绍-xcodebuild failed with code 65  问题解决 一.Appium Desktop介绍 Appium Desktop是一款用于Mac.Wind ...

  6. bzoj2750最短路计数

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2750 枚举每一个起点,通过该边的子树中有多少节点就知道本次它被经过几次了: 因为同一起点到该 ...

  7. [DP题]放苹果

    放苹果(DP做法) 描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法.输入第一行是测试数据的数目t(0 < ...

  8. HDU 3179 二叉搜索树(树的建立)

    二叉搜索树 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  9. 5月25日-js操作DOM遍历子节点

    一.遍历节点 遍历子节点 children();//获取节点的所有直接子类 遍历同辈节点 next(); prev(); siblings();//所有同辈元素 *find(); 从后代元素中查找匹配 ...

  10. linux centos 6.1 安装 redis

    1, yum install redis 检测是否有redis 2,没有的话就运行:yum install epel-release 3,再执行 yum install redis