Code:

  1. //洛谷 P4148 简单题 KD-Tree 模板题
  2.  
  3. #include <cstdio>
  4. #include <algorithm>
  5. #include <cstring>
  6. #include <string>
  7. using namespace std;
  8. void setIO(string a){ freopen((a+".in").c_str(),"r",stdin);}
  9.  
  10. #define maxn 500007
  11.  
  12. int root,d,tot;
  13. struct Data
  14. {
  15. int ch[2],sum,w,minv[2],maxv[2],p[2];
  16. }node[maxn];
  17. bool cmp(Data i,Data j)
  18. {
  19. return i.p[d] == j.p[d]? i.p[d^1] < j.p[d^1]: i.p[d]<j.p[d];
  20. }
  21. bool isout(int k,int x1,int y1,int x2,int y2)
  22. {
  23. if(node[k].maxv[0]<x1||node[k].minv[0]>x2||node[k].maxv[1]<y1||node[k].minv[1]>y2) return 1;
  24. return 0;
  25. }
  26. bool isin(int k,int x1,int y1,int x2,int y2)
  27. {
  28. if(node[k].maxv[0]<=x2 && node[k].minv[0]>=x1 && node[k].maxv[1]<=y2 && node[k].minv[1]>=y1) return 1;
  29. return 0;
  30. }
  31. void pushup(int x,int o)
  32. {
  33. node[x].minv[0]=min(node[x].minv[0],node[o].minv[0]);
  34. node[x].maxv[0]=max(node[x].maxv[0],node[o].maxv[0]);
  35. node[x].minv[1]=min(node[x].minv[1],node[o].minv[1]);
  36. node[x].maxv[1]=max(node[x].maxv[1],node[o].maxv[1]);
  37. node[x].sum+=node[o].sum;
  38. }
  39. int build(int l,int r,int o)
  40. {
  41. int mid=(l+r)>>1;
  42. d=o, nth_element(node + l, node + mid, node + r + 1, cmp);
  43. node[mid].minv[0] = node[mid].maxv[0] = node[mid].p[0];
  44. node[mid].minv[1] = node[mid].maxv[1] = node[mid].p[1];
  45. node[mid].sum = node[mid].w;
  46. node[mid].ch[0]=node[mid].ch[1]=0;
  47. if(l < mid) node[mid].ch[0] = build(l, mid-1, o^1), pushup(mid, node[mid].ch[0]);
  48. if(r > mid) node[mid].ch[1] = build(mid + 1, r , o^1), pushup(mid, node[mid].ch[1]);
  49. return mid;
  50. }
  51. int query(int k,int x1,int y1,int x2,int y2)
  52. {
  53. if(!k||isout(k,x1,y1,x2,y2)) return 0;
  54. if(isin(k,x1,y1,x2,y2)) return node[k].sum;
  55. int ans=0;
  56. if(x1<=node[k].p[0]&&x2>=node[k].p[0]&&y1<=node[k].p[1]&&y2>=node[k].p[1]) ans+=node[k].w;
  57. ans+=query(node[k].ch[0],x1,y1,x2,y2)+query(node[k].ch[1],x1,y1,x2,y2);
  58. return ans;
  59. }
  60. void insert(int x)
  61. {
  62. int *t = &root;
  63. d = 0;
  64. while(*t) pushup(*t , x) , t = &node[*t].ch[ node[x].p[d] > node[*t].p[d] ] , d ^= 1;
  65. *t = x;
  66. }
  67. int main()
  68. {
  69. //setIO("input");
  70. int n,lastans=0,opt;
  71. scanf("%d",&n);
  72. while(1)
  73. {
  74. scanf("%d",&opt);
  75. if(opt == 1)
  76. {
  77. int x,y,a;
  78. scanf("%d%d%d",&x,&y,&a),x^=lastans,y^=lastans,a^=lastans;
  79. ++tot;
  80. node[tot].p[0]=x,node[tot].p[1]=y;
  81. node[tot].maxv[0]=node[tot].minv[0]=x;
  82. node[tot].maxv[1]=node[tot].minv[1]=y;
  83. node[tot].w=node[tot].sum=a;
  84. insert(tot);
  85. if(tot%10000==0) root=build(1,tot,0);
  86. }
  87. if(opt == 2)
  88. {
  89. int x1,y1,x2,y2;
  90. scanf("%d%d%d%d",&x1,&y1,&x2,&y2),x1^=lastans,y1^=lastans,x2^=lastans,y2^=lastans;
  91. lastans=query(root,x1,y1,x2,y2);
  92. printf("%d\n",lastans);
  93. }
  94. if(opt == 3) break;
  95. }
  96. return 0;
  97. }

  

洛谷 P4148 简单题 KD-Tree 模板题的更多相关文章

  1. 洛谷 P4148 简单题 解题报告

    P4148 简单题 题意 维护单点加与矩形求和,强制在线 说明 \(n\le 500000,m\le 200000\),\(4000ms / 20MB\) kd-tree 复杂度我不懂 是一颗平衡树, ...

  2. 洛谷OJ U552 守墓人 线段树模板题

    题目描述 Description 在一个荒凉的墓地上 有一个令人尊敬的守墓人, 他看守的墓地从来 没有被盗过, 所以人们很放心的把自己的先人的墓 安顿在他那 守墓人能看好这片墓地是必然而不是偶然... ...

  3. 洛谷 P3367 并查集 【模板题】

    题目描述 如题,现在有一个并查集,你需要完成合并和查询操作. 输入输出格式 输入格式: 第一行包含两个整数N.M,表示共有N个元素和M个操作. 接下来M行,每行包含三个整数Zi.Xi.Yi 当Zi=1 ...

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

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

  5. 洛谷试炼场-简单数学问题-P1045 麦森数-高精度快速幂

    洛谷试炼场-简单数学问题 B--P1045 麦森数 Description 形如2^P−1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果PP是个素数,2^P-1 不一定也是素数.到19 ...

  6. k-d tree模板练习

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

  7. 洛谷试炼场-简单数学问题-P1088 火星人

    洛谷试炼场-简单数学问题 A--P1088 火星人 Description 人类终于登上了火星的土地并且见到了神秘的火星人.人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法 ...

  8. 洛谷试炼场-简单数学问题-P1403 [AHOI2005]-因数

    洛谷试炼场-简单数学问题 P1403 [AHOI2005]约数研究 Description 科学家们在Samuel星球上的探险得到了丰富的能源储备,这使得空间站中大型计算机"Samuel I ...

  9. DP【洛谷P1704】 寻找最优美做题曲线

    [洛谷P1704] 寻找最优美做题曲线 题目背景 nodgd是一个喜欢写程序的同学,前不久(好像还是有点久了)洛谷OJ横空出世,nodgd同学当然第一时间来到洛谷OJ刷题.于是发生了一系列有趣的事情, ...

随机推荐

  1. JAVA设计模式之【建造者模式】

    建造者模式 建造者模式为客户端返回的不是一个简单的产品,而是一个由多个部件组成的复杂产品 角色 Builder抽象建造者 buildPartX getResult ConcreteBuilder具体建 ...

  2. Oracle 10g RAC (linux) ASM 共享存储的管理详解

    ---------ASM 的管理(共享磁盘的管理)1.以 instance 的方式管理 ASM,启动 database 之前必须先启动 ASM instance,ASM instance 启动后,挂载 ...

  3. 138.安全退出的异常,要用throw 尽量不用exit(0)

    #include<iostream> #include<cstdlib> using namespace std; ////非安全退出,结束进程, //C++ 必须释放对象,最 ...

  4. Win7 如何禁用“切换用户”功能

    1.按win+r,输入gpedit.msc,点击确定: 2.依次点击计算机配置--管理模块--系统--登录,右侧列表中找到“隐藏“快速用户切换”的入口点”: 3.双击隐藏“快速用户切换”的入口点,点击 ...

  5. Visual Studio蛋疼问题解决(1)

    监视变量显示未定义标识符: VS2012在编译的时候采用了较快的编译模式,所以有些变量就显示未定义了.  解决方案:  项目->属性->c/c++->优化->改为禁用/OD  ...

  6. Mysql表引擎的切换

    转换MYSQL表的引擎 1.方法一:Alter table 将1个表的引擎修改为另一个引擎最简单的方法是使用Alter table语句. 下面的语句将myTable的引擎修改为InnoDB mysql ...

  7. hiho 1620 - 股票价格3 - 无限制的单调队列?

    题目链接 小Hi最近在关注股票,为了计算股票可能的盈利,他获取了一只股票最近N天的价格A1~AN. 小Hi想知道,对于第i天的股票价格Ai,几天之后股价会第一次超过Ai. 假设A=[69, 73, 6 ...

  8. ZOJ 2883 Shopaholic【贪心】

    解题思路:给出n件物品,每买三件,折扣为这三件里面最便宜的那一件即将n件物品的价值按降序排序,依次选择a[3],a[6],a[9]----a[3*k] Shopaholic Time Limit: 2 ...

  9. MariaDB GALERA 集群双节点部署

    节点1:10.2.2.41 节点2:10.2.2.42 软件: mariadb-galera-10.0.22-linux-x86_64.tar.gz #galera相关参数:(两个节点配置文件类似) ...

  10. Dropout 下(关于《Dropout: A Simple way to prevent neural networks from overfitting》)

    先上菜单: 摘要: Deep neural nets with a large number of parameters are very powerful machine learning syst ...