洛谷 P4148 简单题 KD-Tree 模板题
Code:
- //洛谷 P4148 简单题 KD-Tree 模板题
- #include <cstdio>
- #include <algorithm>
- #include <cstring>
- #include <string>
- using namespace std;
- void setIO(string a){ freopen((a+".in").c_str(),"r",stdin);}
- #define maxn 500007
- int root,d,tot;
- struct Data
- {
- int ch[2],sum,w,minv[2],maxv[2],p[2];
- }node[maxn];
- bool cmp(Data i,Data j)
- {
- return i.p[d] == j.p[d]? i.p[d^1] < j.p[d^1]: i.p[d]<j.p[d];
- }
- bool isout(int k,int x1,int y1,int x2,int y2)
- {
- if(node[k].maxv[0]<x1||node[k].minv[0]>x2||node[k].maxv[1]<y1||node[k].minv[1]>y2) return 1;
- return 0;
- }
- bool isin(int k,int x1,int y1,int x2,int y2)
- {
- if(node[k].maxv[0]<=x2 && node[k].minv[0]>=x1 && node[k].maxv[1]<=y2 && node[k].minv[1]>=y1) return 1;
- return 0;
- }
- void pushup(int x,int o)
- {
- node[x].minv[0]=min(node[x].minv[0],node[o].minv[0]);
- node[x].maxv[0]=max(node[x].maxv[0],node[o].maxv[0]);
- node[x].minv[1]=min(node[x].minv[1],node[o].minv[1]);
- node[x].maxv[1]=max(node[x].maxv[1],node[o].maxv[1]);
- node[x].sum+=node[o].sum;
- }
- int build(int l,int r,int o)
- {
- int mid=(l+r)>>1;
- d=o, nth_element(node + l, node + mid, node + r + 1, cmp);
- node[mid].minv[0] = node[mid].maxv[0] = node[mid].p[0];
- node[mid].minv[1] = node[mid].maxv[1] = node[mid].p[1];
- node[mid].sum = node[mid].w;
- node[mid].ch[0]=node[mid].ch[1]=0;
- if(l < mid) node[mid].ch[0] = build(l, mid-1, o^1), pushup(mid, node[mid].ch[0]);
- if(r > mid) node[mid].ch[1] = build(mid + 1, r , o^1), pushup(mid, node[mid].ch[1]);
- return mid;
- }
- int query(int k,int x1,int y1,int x2,int y2)
- {
- if(!k||isout(k,x1,y1,x2,y2)) return 0;
- if(isin(k,x1,y1,x2,y2)) return node[k].sum;
- int ans=0;
- 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;
- ans+=query(node[k].ch[0],x1,y1,x2,y2)+query(node[k].ch[1],x1,y1,x2,y2);
- return ans;
- }
- void insert(int x)
- {
- int *t = &root;
- d = 0;
- while(*t) pushup(*t , x) , t = &node[*t].ch[ node[x].p[d] > node[*t].p[d] ] , d ^= 1;
- *t = x;
- }
- int main()
- {
- //setIO("input");
- int n,lastans=0,opt;
- scanf("%d",&n);
- while(1)
- {
- scanf("%d",&opt);
- if(opt == 1)
- {
- int x,y,a;
- scanf("%d%d%d",&x,&y,&a),x^=lastans,y^=lastans,a^=lastans;
- ++tot;
- node[tot].p[0]=x,node[tot].p[1]=y;
- node[tot].maxv[0]=node[tot].minv[0]=x;
- node[tot].maxv[1]=node[tot].minv[1]=y;
- node[tot].w=node[tot].sum=a;
- insert(tot);
- if(tot%10000==0) root=build(1,tot,0);
- }
- if(opt == 2)
- {
- int x1,y1,x2,y2;
- scanf("%d%d%d%d",&x1,&y1,&x2,&y2),x1^=lastans,y1^=lastans,x2^=lastans,y2^=lastans;
- lastans=query(root,x1,y1,x2,y2);
- printf("%d\n",lastans);
- }
- if(opt == 3) break;
- }
- return 0;
- }
洛谷 P4148 简单题 KD-Tree 模板题的更多相关文章
- 洛谷 P4148 简单题 解题报告
P4148 简单题 题意 维护单点加与矩形求和,强制在线 说明 \(n\le 500000,m\le 200000\),\(4000ms / 20MB\) kd-tree 复杂度我不懂 是一颗平衡树, ...
- 洛谷OJ U552 守墓人 线段树模板题
题目描述 Description 在一个荒凉的墓地上 有一个令人尊敬的守墓人, 他看守的墓地从来 没有被盗过, 所以人们很放心的把自己的先人的墓 安顿在他那 守墓人能看好这片墓地是必然而不是偶然... ...
- 洛谷 P3367 并查集 【模板题】
题目描述 如题,现在有一个并查集,你需要完成合并和查询操作. 输入输出格式 输入格式: 第一行包含两个整数N.M,表示共有N个元素和M个操作. 接下来M行,每行包含三个整数Zi.Xi.Yi 当Zi=1 ...
- BZOJ 2648 / 2716 K-D Tree 模板题
#include <cstdio> #include <cmath> #include <cstring> #include <algorithm> # ...
- 洛谷试炼场-简单数学问题-P1045 麦森数-高精度快速幂
洛谷试炼场-简单数学问题 B--P1045 麦森数 Description 形如2^P−1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果PP是个素数,2^P-1 不一定也是素数.到19 ...
- k-d tree模板练习
1. [BZOJ]1941: [Sdoi2010]Hide and Seek 题目大意:给出n个二维平面上的点,一个点的权值是它到其他点的最长距离减最短距离,距离为曼哈顿距离,求最小权值.(n< ...
- 洛谷试炼场-简单数学问题-P1088 火星人
洛谷试炼场-简单数学问题 A--P1088 火星人 Description 人类终于登上了火星的土地并且见到了神秘的火星人.人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法 ...
- 洛谷试炼场-简单数学问题-P1403 [AHOI2005]-因数
洛谷试炼场-简单数学问题 P1403 [AHOI2005]约数研究 Description 科学家们在Samuel星球上的探险得到了丰富的能源储备,这使得空间站中大型计算机"Samuel I ...
- DP【洛谷P1704】 寻找最优美做题曲线
[洛谷P1704] 寻找最优美做题曲线 题目背景 nodgd是一个喜欢写程序的同学,前不久(好像还是有点久了)洛谷OJ横空出世,nodgd同学当然第一时间来到洛谷OJ刷题.于是发生了一系列有趣的事情, ...
随机推荐
- JAVA设计模式之【建造者模式】
建造者模式 建造者模式为客户端返回的不是一个简单的产品,而是一个由多个部件组成的复杂产品 角色 Builder抽象建造者 buildPartX getResult ConcreteBuilder具体建 ...
- Oracle 10g RAC (linux) ASM 共享存储的管理详解
---------ASM 的管理(共享磁盘的管理)1.以 instance 的方式管理 ASM,启动 database 之前必须先启动 ASM instance,ASM instance 启动后,挂载 ...
- 138.安全退出的异常,要用throw 尽量不用exit(0)
#include<iostream> #include<cstdlib> using namespace std; ////非安全退出,结束进程, //C++ 必须释放对象,最 ...
- Win7 如何禁用“切换用户”功能
1.按win+r,输入gpedit.msc,点击确定: 2.依次点击计算机配置--管理模块--系统--登录,右侧列表中找到“隐藏“快速用户切换”的入口点”: 3.双击隐藏“快速用户切换”的入口点,点击 ...
- Visual Studio蛋疼问题解决(1)
监视变量显示未定义标识符: VS2012在编译的时候采用了较快的编译模式,所以有些变量就显示未定义了. 解决方案: 项目->属性->c/c++->优化->改为禁用/OD ...
- Mysql表引擎的切换
转换MYSQL表的引擎 1.方法一:Alter table 将1个表的引擎修改为另一个引擎最简单的方法是使用Alter table语句. 下面的语句将myTable的引擎修改为InnoDB mysql ...
- hiho 1620 - 股票价格3 - 无限制的单调队列?
题目链接 小Hi最近在关注股票,为了计算股票可能的盈利,他获取了一只股票最近N天的价格A1~AN. 小Hi想知道,对于第i天的股票价格Ai,几天之后股价会第一次超过Ai. 假设A=[69, 73, 6 ...
- ZOJ 2883 Shopaholic【贪心】
解题思路:给出n件物品,每买三件,折扣为这三件里面最便宜的那一件即将n件物品的价值按降序排序,依次选择a[3],a[6],a[9]----a[3*k] Shopaholic Time Limit: 2 ...
- MariaDB GALERA 集群双节点部署
节点1:10.2.2.41 节点2:10.2.2.42 软件: mariadb-galera-10.0.22-linux-x86_64.tar.gz #galera相关参数:(两个节点配置文件类似) ...
- 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 ...