同p2626。由于K比较小,所以不必用堆。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cmath>
  4. #include<algorithm>
  5. using namespace std;
  6. typedef double db;
  7. #define N 50001
  8. #define INF 2147483647.0
  9. #define KD 5//ά¶ÈÊý
  10. int qp[KD];
  11. int n,root,kd,K;
  12. int dn;
  13. struct Ans
  14. {
  15. int p[KD];
  16. db d;
  17. }ans[10];
  18. int sqr(const int &x){return x*x;}
  19. struct Node
  20. {
  21. int minn[KD],maxx[KD],p[KD];
  22. int ch[2];
  23. void Init()
  24. {
  25. for(int i=0;i<kd;++i)
  26. minn[i]=maxx[i]=p[i];
  27. }
  28. db Dis()
  29. {
  30. db t=0;
  31. for(int i=0;i<kd;++i)
  32. {
  33. t+=(db)sqr(max(0,minn[i]-qp[i]));
  34. t+=(db)sqr(max(0,qp[i]-maxx[i]));
  35. }
  36. return sqrt(t);
  37. }
  38. }T[N<<1];
  39. void Update(int rt)
  40. {
  41. for(int i=0;i<2;++i)
  42. if(T[rt].ch[i])
  43. for(int j=0;j<kd;++j)
  44. {
  45. T[rt].minn[j]=min(T[rt].minn[j],T[T[rt].ch[i]].minn[j]);
  46. T[rt].maxx[j]=max(T[rt].maxx[j],T[T[rt].ch[i]].maxx[j]);
  47. }
  48. }
  49. db Dis(int a[],int b[])
  50. {
  51. db t=0;
  52. for(int i=0;i<kd;++i)
  53. t+=(db)sqr(a[i]-b[i]);
  54. return sqrt(t);
  55. }
  56. bool operator < (const Node &a,const Node &b){return a.p[dn]<b.p[dn];}
  57. int Buildtree(int l=1,int r=n,int d=0)
  58. {
  59. dn=d;
  60. int m=(l+r>>1);
  61. nth_element(T+l,T+m,T+r+1);
  62. T[m].Init();
  63. if(l!=m) T[m].ch[0]=Buildtree(l,m-1,(d+1)%kd);
  64. if(m!=r) T[m].ch[1]=Buildtree(m+1,r,(d+1)%kd);
  65. Update(m);
  66. return m;
  67. }
  68. void Query(int rt=root)
  69. {
  70. db t=Dis(T[rt].p,qp);
  71. for(int i=0;i<K;++i)
  72. if(t<ans[i].d)
  73. {
  74. for(int j=K-1;j>=i+1;--j)
  75. ans[j]=ans[j-1];
  76. ans[i].d=t;
  77. memcpy(ans[i].p,T[rt].p,sizeof(T[rt].p));
  78. break;
  79. }
  80. db dd[2];
  81. for(int i=0;i<2;i++)
  82. if(T[rt].ch[i])
  83. dd[i]=T[T[rt].ch[i]].Dis();
  84. else dd[i]=INF;
  85. bool f=(dd[0]<=dd[1]);
  86. if(dd[!f]<ans[K-1].d && T[rt].ch[!f]) Query(T[rt].ch[!f]);
  87. if(dd[f]<ans[K-1].d && T[rt].ch[f]) Query(T[rt].ch[f]);
  88. }
  89. int q;
  90. int main()
  91. {
  92. // freopen("bzoj3053.in","r",stdin);
  93. // freopen("bzoj3053.out","w",stdout);
  94. while(scanf("%d%d",&n,&kd)!=EOF)
  95. {
  96. for(int i=1;i<=n;++i)
  97. for(int j=0;j<kd;++j)
  98. scanf("%d",&T[i].p[j]);
  99. Buildtree();
  100. root=(1+n>>1);
  101. scanf("%d",&q);
  102. for(;q;--q)
  103. {
  104. for(int i=0;i<kd;++i)
  105. scanf("%d",&qp[i]);
  106. scanf("%d",&K);
  107. for(int i=0;i<K;++i)
  108. ans[i].d=INF;
  109. Query();
  110. printf("the closest %d points are:\n",K);
  111. for(int i=0;i<K;++i)
  112. {
  113. for(int j=0;j<kd-1;++j)
  114. printf("%d ",ans[i].p[j]);
  115. printf("%d\n",ans[i].p[kd-1]);
  116. }
  117. }
  118. for(int i=1;i<=n;++i)
  119. T[i].ch[0]=T[i].ch[1]=0;
  120. }
  121. return 0;
  122. }

【kd-tree】bzoj3053 The Closest M Points的更多相关文章

  1. 【BZOJ】3053: The Closest M Points(kdtree)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3053 本来是1a的QAQ.... 没看到有多组数据啊.....斯巴达!!!!!!!!!!!!!!!! ...

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

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

  3. 【HDOJ】4347 The Closest M Points

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

  4. BZOJ3053: The Closest M Points

    题解: 我们可以事先在堆里放入插入m个inf然后不断的比较当前值与堆首元素的大小,如果小于的话进入. 估计函数也可以随便写写... query的时候貌似不用保留dir... return 0写在 wh ...

  5. 【Symmetric Tree】cpp

    题目: Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). F ...

  6. 【Same Tree】cpp

    题目: Given two binary trees, write a function to check if they are equal or not. Two binary trees are ...

  7. 【LSGDOJ1834 Tree】树链剖分

    题目描述 给定一个N个结点的无向树,树中的结点按照1...N编号,树中的边按照1...N − 1编号,每条边都赋予一个权值.你需要编写程序支持以下三种操作: 1.    CHANGE i v:将i号边 ...

  8. 【BZOJ4154】Generating Synergy【kd树】

    题意 给定一棵以1为根的有根树,初始所有节点颜色为1,每次将距离节点a不超过l的a的子节点染成c,或询问点a的颜色 分析 我们以dfs序为横坐标,深度为纵坐标,建kd树.我们每次更新,都是在kd树中更 ...

  9. 【BZOJ3489】A simple rmq problem【kd树】

    题意 给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一次的数,并且要求找的这个数尽可能大.如果找不到这样的数,则直接输出0.我会采取一些措施强制在线. 分析 预处理 ...

随机推荐

  1. ThinkPHP的路由形式

    首先解释一下,这里路由的意思是:系统从URL参数中分析出当前请求的分组.控制器.操作 .另外我的网址根目录是放在article目录下的,Thinkphp主要有下面几种路由形式 1.pathinfo路径 ...

  2. Appium for Mac 环境准备篇

    之前写过一篇Appium for windows的文章,因为是09年的T400,启动Android模拟器的时候死机三次,那就公司申请台Macbook air吧,15寸的Macbook Pro实在太重了 ...

  3. 重装系统分区时,发现一个叫LVM的东西,找出来和大家分享

    LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,它由Heinz Mauelshagen在Linux 2.4内核上实现,目前 ...

  4. sql日期函数操作

    sql语句获取本周.本月.本年数据 SQL Serverselect * from [data] where  DATEPART(m,[date])=2 Accessselect * from [da ...

  5. NHibernate系列文章七:NHibernate对象状态

    摘要 NHibernate对象持久化 NHibernate对象的三个状态:临时态.持久态.游离态(托管态) NHibernate三状态的相互转化 1. NHibernate对象持久化 NHiberna ...

  6. Android IOS WebRTC 音视频开发总结(六八)-- Google: What's next for WebRTC

    本文主要从用户,公司和技术角度分析美女视频直播这个行业,文章最早发表在我们的微信公众号上,支持原创,详见这里, 欢迎关注微信公众号blackerteam,更多详见www.rtc.help Justio ...

  7. SQLSERVER | 查询数据库中所有的表的名字 | 查询数据库中的所有数据库名

    SQLSERVER 1.查询某个数据库中所有的表名:  SELECT Name FROM SysObjects Where XType='U' ORDER BY Name 2.查询数据库中的所有数据库 ...

  8. linux tr命令详解

    通过使用 tr,您可以非常容易地实现 sed 的许多最基本功能.您可以将 tr 看作为 sed 的(极其)简化的变体:它可以用一个字符来替换另一个字符,或者可以完全除去一些字符.您也可以用它来除去重复 ...

  9. jquery表格增加删除后改变序号

    有个小bug,懒得修了. 目的:增加一行的时候,td第一列排序. 删除一行的时候,td第一列排序 <!DOCTYPE HTML> <html> <head> < ...

  10. nginx环境下配置nagios-关于nagios配置文件nginx.conf

    接上文:nginx环境下配置nagios-关于nginx.conf 配置如下: ;          location ~ .*\.(php|php5)?$          {            ...