传送门

解题思路

  \(KD-Tree\)模板题,\(KD-Tree\)解决的是多维问题,它是一个可以储存\(K\)维数据的二叉树,每一层都被一维所分割。它的插入删除复杂度为\(log^2 n\),它查询最近点对的复杂度为\(O(n^{\frac{k-1}{k}}\),\(k\)代表维数。用堆维护最近点,查询时就先找到它属于的区域,然后回溯时判断一下它到父节点的距离和堆顶的大小,如果比堆顶还大就不递归它的兄弟节点。

代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<queue>
  6. #include<algorithm>
  7. using namespace std;
  8. const int N=50005;
  9. inline int rd(){
  10. int x=0,f=1; char ch=getchar();
  11. while(!isdigit(ch)) f=ch=='-'?0:1,ch=getchar();
  12. while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
  13. return f?x:-x;
  14. }
  15. inline int pw(int x){
  16. return x*x;
  17. }
  18. int n,q,K,t;
  19. struct Node{
  20. int a[7];
  21. void init() {
  22. memset(a,0,sizeof(a));
  23. }
  24. friend bool operator<(const Node A,const Node B){
  25. return A.a[t]<B.a[t];
  26. }
  27. }node[N],pt[N<<2],ans[25];
  28. priority_queue<pair<double,Node> > Q;
  29. struct KD_Tree{
  30. #define mid ((l+r)>>1)
  31. int end[N<<2];
  32. void build(int x,int l,int r,int dep){
  33. if(l>r) return; t=dep%K;
  34. end[x]=0; end[x<<1]=end[x<<1|1]=1;
  35. nth_element(node+l,node+mid,node+r+1);
  36. pt[x]=node[mid];
  37. build(x<<1,l,mid-1,dep+1); build(x<<1|1,mid+1,r,dep+1);
  38. }
  39. void query(int x,int dep,int lim,Node now){
  40. if(end[x]) return;
  41. pair<double,Node> tmp=make_pair(0,pt[x]);
  42. for(int i=0;i<K;i++) tmp.first+=pw(pt[x].a[i]-now.a[i]);
  43. int ls=x<<1,rs=x<<1|1,t=dep%K,flag=0;
  44. if(now.a[t]>=pt[x].a[t]) swap(ls,rs);
  45. if(!end[ls]) query(ls,dep+1,lim,now);
  46. if(Q.size()<lim) Q.push(tmp),flag=1;
  47. else {
  48. if(Q.top().first>tmp.first) Q.pop(),Q.push(tmp);
  49. if(pw(pt[x].a[t]-now.a[t])<Q.top().first) flag=1;
  50. }
  51. if(!end[rs] && flag) query(rs,dep+1,lim,now);
  52. }
  53. #undef mid
  54. }tree;
  55. int main(){
  56. while(~scanf("%d%d",&n,&K)){
  57. for(int i=1;i<=n;i++)
  58. for(int j=0;j<K;j++) node[i].a[j]=rd();
  59. tree.build(1,1,n,0);
  60. for(q=rd();q;q--){
  61. Node now; now.init();
  62. for(int i=0;i<K;i++) now.a[i]=rd();
  63. int t=rd(); tree.query(1,0,t,now);
  64. for(int i=1;!Q.empty();i++)
  65. ans[i]=Q.top().second,Q.pop();
  66. printf("the closest %d points are:\n",t);
  67. for(int i=t;i;i--){
  68. printf("%d",ans[i].a[0]);
  69. for(int j=1;j<K;j++)
  70. printf(" %d",ans[i].a[j]);
  71. putchar('\n');
  72. }
  73. }
  74. }
  75. return 0;
  76. }

hud 4347 The Closest M Points(KD-Tree)的更多相关文章

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

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

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

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

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

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

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

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

  5. 数据结构(KD树):HDU 4347 The Closest M Points

    The Closest M Points Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 98304/98304 K (Java/Ot ...

  6. 【HDOJ】4347 The Closest M Points

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

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

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

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

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

  9. HDU 4347 The Closest M Points (kdTree)

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

随机推荐

  1. Jmeter之完整的HTTP接口测试

    目前很多接口都是基于HTTP的,所以针对HTTP接口测试的了解很重要,下面就简单说明一下,一个基于Jmeter上HTTP接口测试需要的内容. 一.一个HTTP接口测试需要最基础的内容 如下: 简单说明 ...

  2. android dialog,popupwindow,toast窗口的添加机制

    Dialog 窗口添加机制 代码示例 首先举两个例子: 例子1 在Activity中 @OnClick(R.id.but) void onClick() { Log.d("LiaBin&qu ...

  3. github创建仓库,往github上上传自己的项目

    k第一步: 在github上创建仓库 第二步: 创建一个新的项目,填写项目名称,描述 创建完成之后,跳转到下面的页面,下面红框中的网址要记住,在后面上传代码的时候需要使用 这个地址必须要记住!!! 第 ...

  4. vuer-cli 安装笔记

    电脑上装 的软件全卸载了.需要 重装 .整理了一下vue-cli脚手架搭建 1 先下载git 2 再下载node 3安装淘宝镜像 (https://npm.taobao.org/) 4 安装webpa ...

  5. 使用SSI框架写的简单Demo(查询模块)

    在网上看到好多个版本,自己有时间索性就写个Demo记录下整个框架的逻辑流程: 1.首先拷贝整个框架所需要的jar包到WEB-INF/lib包下(这个网上都可以搜到的) 2.配置文件的配置, 2.1.在 ...

  6. HDFS-HA高可用工作机制

    1.HDFS-HA概述 1)所谓HA(high available),即高可用(7*24小时不中断服务). 2)实现高可用最关键的策略是消除单点故障.HA严格来说应该分成各个组件的HA机制:HDFS的 ...

  7. Tunnel Warfare HDU 1540 区间合并+最大最小值

    Tunnel Warfare HDU 1540 区间合并+最大最小值 题意 D x是破坏这个点,Q x是表示查询以x所在的最长的连续的点的个数,R是恢复上一次破坏的点. 题解思路 参考的大佬博客 这里 ...

  8. usleep和sleep

    usleep 和 sleep 都是用于将进程挂起, 所不同的是前者在微秒级别, 后者在秒级别.

  9. JavaScript基础5——动态显示时间

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. ORA-00911: invalid character 错误解决

    多数情况如下: 控制面板--系统和安全---系统--高级系统设置--高级--环境变量--系统变量中 变量名:NLS_LANG 变量值:SIMPLIFIED CHINESE_CHINA.ZHS16GBK ...