P4169 [Violet]天使玩偶/SJY摆棋子

k-d tree 模板

找了好几天才发现输出优化错了....真是zz......

当子树非常不平衡时,就用替罪羊树的思想,拍扁重建。

luogu有个点开了O2才过.......

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cctype>
  6. using namespace std;
  7. char c;void read(int &x){
  8. c=getchar();x=;int f=;
  9. while(!isdigit(c)) c=getchar(),f=(f&&c!='-');
  10. while(isdigit(c)) x=(x<<)+(x<<)+(c^),c=getchar();
  11. x=f?x:-x;
  12. }
  13. void print(int x){
  14. if(x<) putchar('-'),x=-x;
  15. if(x>) print(x/);
  16. putchar(x%+);
  17. }
  18. inline int max(int a,int b){return a>b?a:b;}
  19. inline int min(int a,int b){return a<b?a:b;}
  20. inline int abs(int a){return a<?-a:a;}
  21. #define N 1000010
  22. #define alph (0.75)
  23. #define inf 1e9+7
  24. int n,m,rt,u,ans;
  25. int lit[N],tp1,tp2;
  26. int d;struct node{
  27. int p[];
  28. void init(){read(p[]);read(p[]);}
  29. bool operator < (const node &t) const{
  30. return p[d]<t.p[d];
  31. }
  32. }b[N];
  33. struct data{int mx[],my[],ch[],sz,fa;node ad;}a[N];
  34. #define lc a[o].ch[0]
  35. #define rc a[o].ch[1]
  36. inline void up(int o){
  37. a[o].mx[]=max(a[o].mx[],max(a[lc].mx[],a[rc].mx[]));
  38. a[o].mx[]=min(a[o].mx[],min(a[lc].mx[],a[rc].mx[]));
  39. a[o].my[]=max(a[o].my[],max(a[lc].my[],a[rc].my[]));
  40. a[o].my[]=min(a[o].my[],min(a[lc].my[],a[rc].my[]));
  41. a[o].sz=a[lc].sz+a[rc].sz+;
  42. }
  43. inline void news(int &o,node w){
  44. o=tp1?lit[tp1--]:++u; a[o].ad=w;
  45. lc=rc=; a[o].sz=;
  46. a[o].mx[]=a[o].mx[]=w.p[];
  47. a[o].my[]=a[o].my[]=w.p[];
  48. }
  49. void build(int &o,int l,int r,int wd){
  50. if(l>r) return ;
  51. int mid=l+((r-l)>>);
  52. d=wd;nth_element(b+l,b+mid,b+r+);
  53. news(o,b[mid]);
  54. build(lc,l,mid-,wd^),a[lc].fa=o;
  55. build(rc,mid+,r,wd^),a[rc].fa=o;
  56. up(o);
  57. }
  58. void pia(int o){
  59. if(lc) pia(lc);
  60. lit[++tp1]=o; b[++tp2]=a[o].ad;
  61. if(rc) pia(rc);
  62. }
  63. inline void check(int &o,int wd){
  64. if(alph*a[o].sz<max(a[lc].sz,a[rc].sz))
  65. tp2=,pia(o),build(o,,tp2,wd);
  66. }//是否不平衡需要重建
  67. void ins(int &o,int wd,node w){
  68. if(!o) {news(o,w); return ;}
  69. d=wd;ins(a[o].ch[a[o].ad<w],wd^,w);
  70. up(o);check(o,wd);
  71. }
  72. inline int gdis(int o,node w){
  73. if(!o) return inf;
  74. int res=;
  75. if(w.p[]>a[o].mx[]) res+=w.p[]-a[o].mx[];
  76. if(w.p[]<a[o].mx[]) res+=a[o].mx[]-w.p[];
  77. if(w.p[]>a[o].my[]) res+=w.p[]-a[o].my[];
  78. if(w.p[]<a[o].my[]) res+=a[o].my[]-w.p[];
  79. return res;
  80. }//点与矩形的最小距离
  81. inline int dis(node A,node B){
  82. return abs(A.p[]-B.p[])+abs(A.p[]-B.p[]);
  83. }
  84. void query(int o,node w){
  85. if(!o) return ;
  86. ans=min(ans,dis(a[o].ad,w));
  87. int D[]={gdis(lc,w),gdis(rc,w)},r=D[]>D[];
  88. if(D[r]<ans) query(a[o].ch[r],w);
  89. if(D[r^]<ans) query(a[o].ch[r^],w);
  90. }
  91. int main(){
  92. read(n);read(m);
  93. a[].mx[]=a[].my[]=-inf;
  94. a[].mx[]=a[].my[]=inf;
  95. for(register int i=;i<=n;++i) b[i].init();
  96. build(rt,,n,); node q1;
  97. for(register int i=,q2;i<=m;++i){
  98. read(q2); q1.init();
  99. if(q2==) ins(rt,,q1);
  100. else{
  101. ans=inf,query(rt,q1);
  102. print(ans); putchar('\n');
  103. }
  104. }return ;
  105. }

bzoj2716/2648 / P4169 [Violet]天使玩偶/SJY摆棋子的更多相关文章

  1. 洛谷 P4169 [Violet]天使玩偶/SJY摆棋子 解题报告

    P4169 [Violet]天使玩偶/SJY摆棋子 题目描述 \(Ayu\)在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,\(Ayu\) 却忘了她把天使玩偶埋在了哪 ...

  2. 洛谷P4169 [Violet]天使玩偶/SJY摆棋子(CDQ分治)

    [Violet]天使玩偶/SJY摆棋子 题目传送门 解题思路 用CDQ分治开了氧气跑过. 将输入给的顺序作为第一维的时间,x为第二维,y为第三维.对于距离一个询问(ax,ay),将询问分为四块,左上, ...

  3. P4169 [Violet]天使玩偶/SJY摆棋子

    题目背景 感谢@浮尘ii 提供的一组hack数据 题目描述 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里,所以她决定仅 ...

  4. 洛谷P4169 [Violet]天使玩偶/SJY摆棋子

    %%%神仙\(SJY\) 题目大意: 一个二维平面,有两种操作: \(1.\)增加一个点\((x,y)\) \(2.\)询问距离\((x,y)\)曼哈顿最近的一个点有多远 \(n,m\le 300 0 ...

  5. Luogu P4169 [Violet]天使玩偶/SJY摆棋子

    传送门 二维平面修改+查询,cdq分治可以解决. 求关于某个点曼哈顿距离(x,y坐标)最近的点——dis(A,B) = |Ax-Bx|+|Ay-By| 但是如何去掉绝对值呢? 查看题解发现假设所有的点 ...

  6. luoguP4169 [Violet]天使玩偶/SJY摆棋子 K-Dtree

    P4169 [Violet]天使玩偶/SJY摆棋子 链接 luogu 思路 luogu以前用CDQ一直过不去. bzoj还是卡时过去的. 今天终于用k-dtree给过了. 代码 #include &l ...

  7. [Violet]天使玩偶/SJY摆棋子 [cdq分治]

    P4169 [Violet]天使玩偶/SJY摆棋子 求离 \((x,y)\) 最近点的距离 距离的定义是 \(|x1-x2|+|y1-y2|\) 直接cdq 4次 考虑左上右上左下右下就可以了-略微卡 ...

  8. 【LG4169】[Violet]天使玩偶/SJY摆棋子

    [LG4169][Violet]天使玩偶/SJY摆棋子 题面 洛谷 题解 至于\(cdq\)分治的解法,以前写过 \(kdTree\)的解法好像还\(sb\)一些 就是记一下子树的横.纵坐标最值然后求 ...

  9. LG4169 [Violet]天使玩偶/SJY摆棋子

    题意 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里,所以她决定仅凭一点模糊的记忆来寻找它. 我们把 Ayu 生活的小镇 ...

随机推荐

  1. jenkins 多用户同时触发构建—简单实用

    插件:build name setter plugin 插件地址:http://updates.jenkins-ci.org/download/plugins/ 其实以上插件,不使用也可以,以上插件我 ...

  2. [Java in NetBeans] Lesson 13. Multidimensional Arrays

    这个课程的参考视频和图片来自youtube. 主要学到的知识点有: 1. Multidimensional Array: Array that has more than one dimension. ...

  3. linux下nodejs安装以及如何更新到最新的版本

    nodejs官网下载安装的源码文件,我这边下载的是node-v4.5.0-linux-x64.tar.xz 在linux命令行里输入: tar -xvf node-v4.5.0-linux-x64.t ...

  4. 谷歌启用抓取JavaScript,应对方案!

    谷歌启用了抓取JavaScript来深入了解网站,这样,如果网站或黑页是加了跳转代码或判断代码,很有可能将会被识别出来.虽然目前只是谷歌启用识别JavaScript文件,但国内搜索引擎很可能也会跟着模 ...

  5. (已解决)Xcode 运行cocos2dx弹出内部错误对话框(Internal Error)

    cocos2dx未捕获的异常升高.选择“继续”继续运行在一个不一致的状态.选择“崩溃”停止应用和崩溃报告一个错误文件. 莫名其妙,代码没有报错,运行时却弹出(内部错误)对话框出来: 再看看崩溃的底层代 ...

  6. 前端 json 导出 excel

    参考:https://blog.csdn.net/abel_yang/article/details/78684786 在github上有大神提供现成的插件,非常感谢 https://cuikangj ...

  7. /*使用PHP创建一个数组,保存5個员工的信息(ename/sex/salary/birthday/pic)*/

    <?php/*使用PHP创建一个数组,保存5個员工的信息(ename/sex/salary/birthday/pic)*/$empList=[    ['ename'=>'张学友','se ...

  8. TP父类及模板继承

    一.TP父类方法继承 session用法 用登录页面做例子 <?php namespace Home\Controller; use Think\Controller; class LoginC ...

  9. java outterLoop跳出多重循环用法以及详解

    List<CommResultMsg> listresult=new ArrayList<CommResultMsg>(); outterLoop :for (int i = ...

  10. factory源码分析——component_registry和object_registry

    registry类主要是为object和component提供一个轻量级的代理(lightweight proxy)来方便factory实现: registry class从uvm_object_wr ...