学习了一下kd-tree的基本写法 http://blog.csdn.net/jiangshibiao/article/details/34144829 配合 http://www.bilibili.com/video/av7039143/ 食用

不过这个博客的里面那道2648的代码是错的 应该加上一句if(n)build 否则应该在插入第一个黑点的时候建树

kd-tree的写法还是很简单的 如果学习过线段树 应该很容易就学会了模板了

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<algorithm>
  4. #include<map>
  5. #include<math.h>
  6. #include<queue>
  7. #include<string>
  8. using namespace std;
  9. #define L long long
  10. const int INF = 999999999 ;
  11. int n , m , root , cmp_d ;
  12. int x, y ;
  13. struct node{
  14. int d[2] , Max[2] , Min[2] ;
  15. int l, r ;
  16. }tr[1000050];
  17. bool cmp(node a , node b){
  18. return a.d[cmp_d] < b.d[cmp_d] || a.d[cmp_d] == b.d[cmp_d] && a.d[cmp_d^1] < b.d[cmp_d^1];
  19. }
  20. void up(int p,int k){
  21. if(tr[k].Max[0] > tr[p].Max[0]) tr[p].Max[0] = tr[k].Max[0] ;
  22. if(tr[k].Max[1] > tr[p].Max[1]) tr[p].Max[1] = tr[k].Max[1] ;
  23. if(tr[k].Min[0] < tr[p].Min[0]) tr[p].Min[0] = tr[k].Min[0] ;
  24. if(tr[k].Min[1] < tr[p].Min[1]) tr[p].Min[1] = tr[k].Min[1] ;
  25. }
  26. int build(int l,int r, int D){
  27. int mid = (l+r) >> 1;
  28. cmp_d = D;
  29. nth_element(tr+l+1,tr+mid+1,tr+r+1,cmp) ;
  30. tr[mid].Max[0] = tr[mid].Min[0] = tr[mid].d[0];
  31. tr[mid].Max[1] = tr[mid].Min[1] = tr[mid].d[1];
  32. if(l!=mid)
  33. tr[mid].l = build(l,mid-1,D^1) ;
  34. else tr[mid].l = 0;
  35. if(r!=mid)
  36. tr[mid].r = build(mid+1,r,D^1);
  37. else tr[mid].r = 0;
  38. if(tr[mid].l)up(mid,tr[mid].l);
  39. if(tr[mid].r)up(mid,tr[mid].r);
  40. return mid ;
  41. }
  42. void inse(int k){
  43. int p = root ;
  44. int D = 0 ;
  45. while(true){
  46. up(p,k);
  47. if(tr[k].d[D] <= tr[p].d[D]){
  48. if(!tr[p].l){
  49. tr[p].l = k ;
  50. return;
  51. }
  52. p = tr[p].l ;
  53. }
  54. else {
  55. if(!tr[p].r){
  56. tr[p].r = k ;
  57. return;
  58. }
  59. p = tr[p].r ;
  60. }
  61. D ^= 1;
  62. }
  63. }
  64. int ans ;
  65. int getdis(int p,int x,int y){
  66. int res = 0;
  67. if(x > tr[p].Max[0])res += x - tr[p].Max[0];
  68. if(x < tr[p].Min[0])res += tr[p].Min[0] - x;
  69. if(y > tr[p].Max[1])res += y - tr[p].Max[1];
  70. if(y < tr[p].Min[1])res += tr[p].Min[1] - y;
  71. return res ;
  72. }
  73. void ask(int p){
  74. int d0 = abs(x - tr[p].d[0]) + abs(y - tr[p].d[1]) ;
  75. if(d0<ans)ans = d0 ;
  76. int dl , dr ;
  77. if(tr[p].l)dl=getdis(tr[p].l,x,y) ;else dl = INF ;
  78. if(tr[p].r)dr=getdis(tr[p].r,x,y) ;else dr = INF ;
  79. if(dl < dr){
  80. if(dl < ans)ask(tr[p].l) ;
  81. if(dr < ans)ask(tr[p].r) ;
  82. }
  83. else {
  84. if(dr < ans)ask(tr[p].r) ;
  85. if(dl < ans)ask(tr[p].l) ;
  86. }
  87. }
  88.  
  89. int main(){
  90. scanf("%d%d",&n,&m);
  91. for(int i = 1; i <= n ; i ++ ){
  92. scanf("%d%d",&tr[i].d[0] , &tr[i].d[1]);
  93. }
  94. if(n)
  95. root = build(1,n,0) ;
  96. for(int i = 1; i <= m ; i ++ ){
  97. int q;
  98. scanf("%d%d%d",&q,&x,&y);
  99. if(q == 1){
  100. n ++ ;
  101. tr[n].d[0]=tr[n].Max[0]=tr[n].Min[0]=x;
  102. tr[n].d[1]=tr[n].Max[1]=tr[n].Min[1]=y;
  103. if(n>1)
  104. inse(n);
  105. else {
  106. root = build(1,n,0);
  107. }
  108. }
  109. else {
  110. ans = INF;
  111. ask(root);
  112. printf("%d\n",ans);
  113. }
  114. }
  115. }

  

BZOJ 2648 kd-tree模板的更多相关文章

  1. k-d tree模板练习

    1. [BZOJ]1941: [Sdoi2010]Hide and Seek 题目大意:给出n个二维平面上的点,一个点的权值是它到其他点的最长距离减最短距离,距离为曼哈顿距离,求最小权值.(n< ...

  2. BZOJ 2648 / 2716 K-D Tree 模板题

    #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> # ...

  3. BZOJ - 2648 KD树 最近点查询

    省赛后躺尸几天又回来更新了,内容是说好的KD树.. 具体操作从代码中感受一下 感觉已经把KD树尽量封装好了(虽然全局的D看着极不顺眼) 需要注意的是估值函数的判断条件 #include<bits ...

  4. 【BZOJ-2648&2716】SJY摆棋子&天使玩偶 KD Tree

    2648: SJY摆棋子 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2459  Solved: 834[Submit][Status][Discu ...

  5. kd-tree注解 &amp; bzoj 2648 &amp; 2716 &amp; 3053 解决问题的方法

    [KD-TREE简介]于SYC1999大神"迷住"下一个.我开始接触这样的算法. 首先.这个概念大概能去百度百科.详细的实施.我在看RZZ的代码长大的. 我们能够想象在平面上有N个 ...

  6. BZOJ2648/2716:SJY摆棋子/[Violet]天使玩偶(K-D Tree)

    Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子. ...

  7. BZOJ 2648: SJY摆棋子(K-D Tree)

    Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 6051  Solved: 2113[Submit][Status][Discuss] Descript ...

  8. [模板] K-D Tree

    K-D Tree K-D Tree可以看作二叉搜索树的高维推广, 它的第 \(k\) 层以所有点的第 \(k\) 维作为关键字对点做出划分. 为了保证划分均匀, 可以以第 \(k\) 维排名在中间的节 ...

  9. BZOJ 3489: A simple rmq problem(K-D Tree)

    Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 2579  Solved: 888[Submit][Status][Discuss] Descripti ...

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

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

随机推荐

  1. android发短信,打电话

    //1.进入系统短信列表界面 Intent intent = newIntent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_DEF ...

  2. Scala系统学习(四):Scala变量

    变量是保存存储值的内存位置的名称.这意味着当创建变量时,可以在内存中保留一些空间. 根据变量的数据类型,编译器分配内存并决定可以存储在预留内存中的内容.因此,通过为变量分配不同的数据类型,可以在这些变 ...

  3. cocos代码研究(1)Node学习笔记

    理论部分 Node类继承自Ref类,是cocos框架中基础底层的一个封装类,与画面渲染相关的类一般都是继承自该类,例如Scene,Layer,Sprite,Sprite3D,Label,SpriteB ...

  4. cxf-webservice完整示例

    最近一段时间研究webservice,一般来说,开发java的Webservice经常使用axis2和cxf这两个比较流行的框架 先使用cxf,开发一个完整示例,方便对webservice有一个整体的 ...

  5. 关于Redis-存Long取Integer类型转换错误的问题;String对象被转义的问题

    背景 最近遇到了两个Redis相关的问题,趁着清明假期,梳理整理. 1.存入Long类型对象,在代码中使用Long类型接收,结果报类型转换错误. 2.String对象的反序列化问题,直接在Redis服 ...

  6. Learning to Rank算法介绍:RankSVM 和 IR SVM

    之前的博客:http://www.cnblogs.com/bentuwuying/p/6681943.html中简单介绍了Learning to Rank的基本原理,也讲到了Learning to R ...

  7. 论文笔记:Emotion Recognition From Speech With Recurrent Neural Networks

    动机(Motivation) 在自动语音识别(Automated Speech Recognition, ASR)中,只是把语音内容转成文字,但是人们对话过程中除了文本还有其它重要的信息,比如语调,情 ...

  8. Linux基础命令---sudo

    sudo sudo允许用户以超级用户或安全策略指定的另一个用户的身份执行命令.Sudo支持安全策略插件和输入/输出日志的插件.第三方可以开发和分发自己的策略和I/O日志插件,以便与sudo前端无缝地工 ...

  9. 2016NOI冬令营day4

    上午:随机算法/近似算法与随机算法的分析方法与应用实例 不懂,完全滑水QAQ :( 下午:计算理论与NP问题 只有讲2-sat和3-sat的时候能听懂,其他的基本都在滑水:( 晚上说是什么中学生学术训 ...

  10. shell中参数及带色彩打印

    shell脚本中的一些函数参数说明如下: #!/bin/bash echo 显示参数的个数: $# echo 以单个字符串把每个参数连接起来: $* echo 显示脚本当前运行的进程id: $$ ec ...