题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2648

第一道KDtree!

学习资料:https://blog.csdn.net/zhl30041839/article/details/9277807

     https://www.cnblogs.com/galaxies/p/kdtree.html

这道题的代码是学习(抄)的这里的:https://blog.csdn.net/lych_cys/article/details/50809141

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. const int N=1e6+,INF=0x3f3f3f3f;
  7. int n,m,fx,rt,ans,tot;
  8. struct Node{
  9. int x[],y[],p[];//x:min y:max p:ps
  10. }a[N>>];
  11. bool cmp(Node u,Node v){return u.p[fx]<v.p[fx];}
  12. struct Kd{
  13. int c[N][];Node s[N],q;//大家的儿子、根和唯一的询问
  14. void add(int cr,Node k)
  15. { for(int i=;i<;i++) s[cr].x[i]=s[cr].y[i]=s[cr].p[i]=k.p[i];}
  16. void pshp(int cr)
  17. {
  18. int ls=c[cr][],rs=c[cr][];
  19. for(int i=;i<;i++)
  20. {
  21. if(ls)
  22. s[cr].x[i]=min(s[cr].x[i],s[ls].x[i]),
  23. s[cr].y[i]=max(s[cr].y[i],s[ls].y[i]);
  24. if(rs)
  25. s[cr].x[i]=min(s[cr].x[i],s[rs].x[i]),
  26. s[cr].y[i]=max(s[cr].y[i],s[rs].y[i]);
  27. }
  28. }
  29. void build(int &cr,int l,int r,int now)
  30. {
  31. int mid=l+r>>;fx=now;
  32. nth_element(a+l,a+mid,a+r+,cmp);
  33. // cr=mid;add(cr,a[mid]);//////cr=mid!
  34. cr=++tot;add(cr,a[mid]);
  35. if(l<mid)build(c[cr][],l,mid-,!now);///if()
  36. if(mid<r)build(c[cr][],mid+,r,!now);
  37. pshp(cr);
  38. }
  39. void insert(int &cr,int now)
  40. {
  41. // if(!cr){cr=++n;add(cr,q);return;}//cr=++n!
  42. if(!cr){cr=++tot;add(cr,q);return;}
  43. if(q.p[now]<s[cr].p[now])insert(c[cr][],!now);
  44. else insert(c[cr][],!now);
  45. pshp(cr);
  46. }
  47. int dist(int cr,Node k)//在区域内返回0
  48. {
  49. int ret=;
  50. for(int i=;i<;i++)
  51. ret+=max(,s[cr].x[i]-k.p[i])+max(,k.p[i]-s[cr].y[i]);
  52. return ret;
  53. }
  54. void query(int cr,int now)
  55. {
  56. ans=min(ans,abs(s[cr].p[]-q.p[])+abs(s[cr].p[]-q.p[]));
  57. int dl=c[cr][]?dist(c[cr][],q):INF,dr=c[cr][]?dist(c[cr][],q):INF;
  58. if(dl<dr)
  59. { if(dl<ans)query(c[cr][],!now); if(dr<ans)query(c[cr][],!now);}
  60. else
  61. { if(dr<ans)query(c[cr][],!now); if(dl<ans)query(c[cr][],!now);}
  62. }
  63. }kd;
  64. int main()
  65. {
  66. scanf("%d%d",&n,&m);
  67. for(int i=;i<=n;i++)scanf("%d%d",&a[i].p[],&a[i].p[]);
  68. kd.build(rt,,n,);
  69. for(int i=,op;i<=m;i++)
  70. {
  71. scanf("%d%d%d",&op,&kd.q.p[],&kd.q.p[]);
  72. if(op==) kd.insert(rt,);
  73. else { ans=INF; kd.query(rt,); printf("%d\n",ans);}
  74. }
  75. return ;
  76. }

bzoj 2648 SJY摆棋子——KDtree的更多相关文章

  1. BZOJ 2648: SJY摆棋子 kdtree

    2648: SJY摆棋子 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2648 Description 这天,SJY显得无聊.在家自己玩 ...

  2. BZOJ 2648 SJY摆棋子 ——KD-Tree

    [题目分析] KD-Tree第一题,其实大概就是搜索剪枝的思想,在随机数据下可以表现的非常好NlogN,但是特殊数据下会达到N^2. 精髓就在于估价函数get以及按照不同维度顺序划分的思想. [代码] ...

  3. bzoj 2648: SJY摆棋子 KDtree + 替罪羊式重构

    KDtree真的很妙啊,真的是又好写,作用还多,以后还需更多学习呀. 对于这道题,我们求的是曼哈顿距离的最小值. 而维护的变量和以往是相同的,就是横纵坐标的最小值与最大值. 我们设为一个极为巧妙且玄学 ...

  4. bzoj 2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 --kdtree

    2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 Time Limit: 20 Sec  Memory Limit: 128 MB Description 这天,S ...

  5. BZOJ 2648: SJY摆棋子

    2648: SJY摆棋子 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2968  Solved: 1011[Submit][Status][Disc ...

  6. bzoj 2648: SJY摆棋子【KD-tree】

    其实理论上cdq更优 核心是依次取x值.y值的mid作为当前节点,向两边递归建立二叉树,树上维护size:子树大小:mx[0/1]:子树内最大x/y:mn[0/1]:子树内最小x/y:d[0/1]:这 ...

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

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

  8. bzoj 2648 SJY摆棋子 kd树

    题目链接 初始的时候有一些棋子, 然后给两种操作, 一种是往上面放棋子. 另一种是给出一个棋子的位置, 问你离它最近的棋子的曼哈顿距离是多少. 写了指针版本的kd树, 感觉这个版本很好理解. #inc ...

  9. BZOJ 2648 SJY摆棋子(KD Tree)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2648 题意: 思路: KDtree模板题. 参考自http://www.cnblogs.com/ra ...

随机推荐

  1. Python菜鸟之路:Python基础-操作缓存memcache、redis

    一.搭建memcached和redis 略,自己去百度吧 二.操作Mmecached 1. 安装API python -m pip install python-memcached 2. 启动memc ...

  2. vue项目创建流程和使用

    vue项目的创建 npm run dev 让项目执行起来 #下载vuex npm install vuex --save#下载axiosnpm install axios --save 当我们生成项目 ...

  3. oracle chain

    [oracle@tyger dbs]$ sqlplus / as sysdba SQL*Plus: Release 10.2.0.1.0 - Production on Tue May 6 13:02 ...

  4. amp模板展示amp网站也可以做得很好看

    ytkah比较喜欢研究一些新东西,AMP刚出来的时候就上手了,也做了一些站点,而且还不赖,因为这个还机缘巧合参加了深圳的谷歌全球合作伙伴大会,很多大牛也都来了,很荣幸能和他们一起交流.下面就稍微展示一 ...

  5. flex 组件重写 组件生命周期

    AS方式重写组件常规步骤 1.如果有必要,为组件创建所有基于标记(tag-based)的皮肤(skins) 2.创建ActionScript类文件 ⑴从一个基类扩展,比如UIComponent或者其他 ...

  6. spring-boot4

    1.1.1. Starter pom 除了官方也有其他第三方提供的starter Websocket是服务端推数据到客户端.长连接. 1.1.1.Xml 配置文件 有些时候必须使用xml配置. 1.1 ...

  7. 在数据库中使用数字ID作为主键的表生成主键方法

    在数据库开发中,很多时候建一个表的时候会使用一个数字类型来作为主键,使用自增长类型自然会更方便,只是本人从来不喜欢有内容不在自己掌控之中,况且自增长类型在进行数据库复制时会比较麻烦.所以本人一直使用自 ...

  8. Idea 包名按树形结构展示

    Idea默认包名展示如图: 感觉这样展示,在包下面建包的时候不方便,可以在 设置按钮 里面去掉 Flatten Packages 和 Compact Empty Middle Packages,设置如 ...

  9. 算法(Algorithms)第4版 练习 1.5.16

    Quick-find package com.qiusongde; import edu.princeton.cs.algs4.StdDraw; import edu.princeton.cs.alg ...

  10. Tomcat处理HTTP请求源码分析(上)

    Tomcat处理HTTP请求源码分析(上) 作者 张华 发布于 2011年12月8日 | 8 讨论 分享到: 微博 微信 Facebook Twitter 有道云笔记 邮件分享 稍后阅读 我的阅读清单 ...