题意

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

分析

kd树的模板题。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <queue>
  6.  
  7. using namespace std;
  8. typedef long long LL;
  9. const int maxn=;
  10. const int K=;
  11. int num,nownum,m;
  12. LL ans;
  13. struct kdNode{
  14. LL x[K];
  15. int div;
  16. bool lef;
  17. }Ans[];
  18. struct Node{
  19. kdNode a;
  20. LL dis;
  21. bool operator <(const Node &a)const{
  22. return dis<a.dis;
  23. }
  24. Node(){}
  25. Node(kdNode &tmp,LL d){
  26. a=tmp;
  27. dis=d;
  28. }
  29. };
  30. int cmpNo;
  31. bool cmp(kdNode a,kdNode b){
  32. return a.x[cmpNo]<b.x[cmpNo];
  33. }
  34. inline LL max(LL a,LL b){//why?
  35. return a>b?a:b;
  36. }
  37. kdNode p[maxn],q;
  38. LL dis(kdNode a,kdNode b,int k){
  39. LL res=;
  40. for(int i=;i<k;i++){
  41. res+=(a.x[i]-b.x[i])*(a.x[i]-b.x[i]);
  42. }
  43. return res;
  44. }
  45. priority_queue<Node>qq;
  46. void buildKD(int l,int r,kdNode* p,int d,int k){
  47. if(l>r)return ;
  48. int m=(l+r)/;
  49. cmpNo=d;
  50. nth_element(p+l,p+m,p+r+,cmp);
  51. p[m].div=d;
  52. if(l==r){
  53. p[m].lef=;
  54. return ;
  55. }
  56. buildKD(l,m-,p,(d+)%k,k);
  57. buildKD(m+,r,p,(d+)%k,k);
  58. }
  59. void findkd(int l,int r,kdNode& tar,kdNode* p,int k){
  60. if(l>r)return;
  61. int m=(l+r)/;
  62. LL d=dis(p[m],tar,k);
  63. if(p[m].lef){
  64. if(nownum<num){
  65. nownum++;
  66. ans=max(ans,d);
  67. qq.push(Node(p[m],d));
  68. }
  69. else if(ans>d){
  70. qq.pop();
  71. qq.push(Node(p[m],d));
  72. ans=qq.top().dis;
  73. }
  74. return;
  75. }
  76. LL t=tar.x[p[m].div]-p[m].x[p[m].div];
  77. if(t>){
  78. findkd(m+,r,tar,p,k);
  79. if(nownum<num){
  80. qq.push(Node(p[m],d));
  81. nownum++;
  82. ans=qq.top().dis;
  83. findkd(l,m-,tar,p,k);
  84. }else{
  85. if(ans>d){
  86. qq.pop();
  87. qq.push(Node(p[m],d));
  88. ans=qq.top().dis;
  89. }
  90. if(ans>t*t)
  91. findkd(l,m-,tar,p,k);
  92. }
  93. }else{
  94. findkd(l,m-,tar,p,k);
  95. if(nownum<num){
  96. qq.push(Node(p[m],d));
  97. nownum++;
  98. ans=qq.top().dis;
  99. findkd(m+,r,tar,p,k);
  100. }else{
  101. if(ans>d){
  102. qq.pop();
  103. qq.push(Node(p[m],d));
  104. ans=qq.top().dis;
  105. }
  106. if(ans>t*t){
  107. findkd(m+,r,tar,p,k);
  108. }
  109. }
  110. }
  111. }
  112.  
  113. int n,k;
  114. int main(){
  115. while(scanf("%d%d",&n,&k)==){
  116. for(int i=;i<n;i++){
  117. for(int j=;j<k;j++){
  118. scanf("%lld",&p[i].x[j]);
  119. }
  120. p[i].lef=;
  121. }
  122. buildKD(,n-,p,k-,k);
  123. int t;
  124. scanf("%d",&t);
  125. for(int i=;i<=t;i++){
  126. ans=-;
  127. nownum=;
  128. for(int j=;j<k;j++){
  129. scanf("%lld",&q.x[j]);
  130. }
  131. while(!qq.empty())qq.pop();
  132. scanf("%d",&num);
  133. findkd(,n-,q,p,k);
  134. for(int j=;j<=num;j++){
  135. Ans[j]=qq.top().a;
  136. qq.pop();
  137. }
  138. printf("the closest %d points are:\n",num);
  139. for(int j=num;j>=;j--){
  140. for(int kk=;kk<k;kk++){
  141. if(kk==)
  142. printf("%lld",Ans[j].x[kk]);
  143. else
  144. printf(" %lld",Ans[j].x[kk]);
  145. }
  146. printf("\n");
  147. }
  148. }
  149. }
  150. return ;
  151. }

【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. 实现斐波拉契数列的四种方式python代码

    斐波那契数列 1. 斐波拉契数列简介 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引 ...

  2. 6-8 Percolate Up and Down(20 分)

    Write the routines to do a "percolate up" and a "percolate down" in a binary min ...

  3. Jenkins搭建windows service自动编译发布环境

    类库项目(Task)部署 前面搭建了Web站点的环境,类库项目发布不同于站点项目,它只需要将MSBuild编译出来的dll复制到目标服务器上即可,而不需要通过Web Deploy,下面来说一下如何发布 ...

  4. [BZOJ3470]Freda’s Walk

    bzoj description 雨后的Poetic Island空气格外清新,于是Freda和Rainbow出来散步. Poetic Island的交通可以看作一张\(n\)个点.\(m\)边的有向 ...

  5. vue.js权威指南----代码解释实例

    1:P61(值绑定) <input type="checkbox" v-model="toggle" :true-value="a" ...

  6. koa/koa2项目搭建

    一键生成koa/koa2项目: 1. npm install -g koa-generator 2.新建项目目录 koa mytest (koa1项目) koa2 koa2test (koa2项目) ...

  7. ARM汇编返回指令

    [ 588.756226] task: ffff000008a22f80 task.stack: ffff000008a10000 [ 588.762153] PC is at vb2_buffer_ ...

  8. Minio Bucket 通知试用&&说明

    kafka 安装 docker run -p 2181:2181 -p 9092:9092 \ --name kafka --rm \ --env ADVERTISED_HOST=HOSTIP \ - ...

  9. Jacoco+Jenkines小白之路

    Jacoco+Jenkines小白之路 最近工作中正在推广jacoco的增量覆盖率的统计,想学习一波,纯粹采坑中,适合小白学习jacoco. 一.代码覆盖率 引入代码覆盖率 : 代码覆盖率是指对现有代 ...

  10. Mybatis 插件实现动态设置参数

    原文地址:Mybatis 插件实现动态设置参数 博客地址:http://www.extlight.com 一.背景 笔者在搭建架构时,通常会利用泛型对 dao 层 和 service 层公共的代码(增 ...