K-D树学习笔记
这东西其实就是高维二叉树?(反正我只会二维的)
大概就是把一个高维矩形按每一维分,一个点(及其子树)就表示一个高维区间,乱搞一下,就……没了?
//BZOJ4066 "简单"题
//维护N*N矩形,初始全为0,支持两种操作:
//1.将格子(x,y)的数字加上A
//2.求(x1,y1)到(x2,y2)这个矩形内的数字和
//3.结束程序
//由于平衡性,每5000次插入就暴力重构一次
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int D;
struct kdnode{
int ls,rs,num,v,d[],mi[],mx[];
int &operator [](int x){
return d[x];
}
friend bool operator <(kdnode a,kdnode b){
return a[D]<b[D];
}
}t[],rb[],s;
int n,op,x1,yy,x2,y2,v,rt=,tot=,R=,ans=;
bool inside(int x1,int yy,int x2,int y2,int x3,int y3,int x4,int y4){
return x1<=x3&&x2>=x4&&yy<=y3&&y2>=y4;
}
bool outside(int x1,int yy,int x2,int y2,int x3,int y3,int x4,int y4){
return x1>x4||x2<x3||yy>y4||y2<y3;
}
void pushup(int u){
int l=t[u].ls,r=t[u].rs;
for(int i=;i<=;i++){
t[u].mi[i]=t[u].mx[i]=t[u][i];
if(l)t[u].mi[i]=min(t[u].mi[i],t[l].mi[i]);
if(l)t[u].mx[i]=max(t[u].mx[i],t[l].mx[i]);
if(r)t[u].mi[i]=min(t[u].mi[i],t[r].mi[i]);
if(r)t[u].mx[i]=max(t[u].mx[i],t[r].mx[i]);
}
t[u].num=t[l].num+t[r].num+t[u].v;
}
int query(int u,int x1,int yy,int x2,int y2){
int ret=;
if(!u)return ;
if(inside(x1,yy,x2,y2,t[u].mi[],t[u].mi[],t[u].mx[],t[u].mx[]))return t[u].num;
if(outside(x1,yy,x2,y2,t[u].mi[],t[u].mi[],t[u].mx[],t[u].mx[]))return ;
if(inside(x1,yy,x2,y2,t[u][],t[u][],t[u][],t[u][]))ret+=t[u].v;
ret+=query(t[u].ls,x1,yy,x2,y2)+query(t[u].rs,x1,yy,x2,y2);
return ret;
}
void ins(int &u,bool d){
if(!u){
u=++tot;
t[u][]=t[u].mi[]=t[u].mx[]=s[];
t[u][]=t[u].mi[]=t[u].mx[]=s[];
}
if(s[]==t[u][]&&s[]==t[u][]){
t[u].v+=s.v;
t[u].num+=s.v;
return;
}
if(s[d]<t[u][d])ins(t[u].ls,d^);
else ins(t[u].rs,d^);
pushup(u);
}
int rebuild(int l,int r,bool d){
if(l>r)return ;
int mid=(l+r)/;
D=d;
nth_element(rb+l,rb+mid,rb+r+);
t[mid]=rb[mid];
t[mid].ls=rebuild(l,mid-,d^);
t[mid].rs=rebuild(mid+,r,d^);
pushup(mid);
return mid;
}
int main(){
scanf("%d",&n);
for(;;){
scanf("%d",&op);
if(op==){
scanf("%d%d%d",&x1,&yy,&v);
x1^=ans;
yy^=ans;
v^=ans;
s[]=x1;
s[]=yy;
s.num=s.v=v;
ins(rt,);
if(tot==R){
for(int j=;j<=tot;j++){
rb[j]=t[j];
}
rt=rebuild(,tot,);
R+=;
}
}else if(op==){
scanf("%d%d%d%d",&x1,&yy,&x2,&y2);
x1^=ans;
yy^=ans;
x2^=ans;
y2^=ans;
printf("%d\n",(ans=query(rt,x1,yy,x2,y2)));
}else break;
}
return ;
}
K-D树学习笔记的更多相关文章
- zkw线段树学习笔记
zkw线段树学习笔记 今天模拟赛线段树被卡常了,由于我自带常数 \(buff\),所以学了下zkw线段树. 平常的线段树无论是修改还是查询,都是从根开始递归找到区间的,而zkw线段树直接从叶子结点开始 ...
- 仙人掌&圆方树学习笔记
仙人掌&圆方树学习笔记 1.仙人掌 圆方树用来干啥? --处理仙人掌的问题. 仙人掌是啥? (图片来自于\(BZOJ1023\)) --也就是任意一条边只会出现在一个环里面. 当然,如果你的图 ...
- 线段树学习笔记(基础&进阶)(一) | P3372 【模板】线段树 1 题解
什么是线段树 线段树是一棵二叉树,每个结点存储需维护的信息,一般用于处理区间最值.区间和等问题. 线段树的用处 对编号连续的一些点进行修改或者统计操作,修改和统计的复杂度都是 O(log n). 基础 ...
- Treap-平衡树学习笔记
平衡树-Treap学习笔记 最近刚学了Treap 发现这种数据结构真的是--妙啊妙啊~~ 咳咳.... 所以发一发博客,也是为了加深蒟蒻自己的理解 顺便帮助一下各位小伙伴们 切入正题 Treap的结构 ...
- JSOI2008 Blue Mary开公司 | 李超线段树学习笔记
题目链接:戳我 这相当于是一个李超线段树的模板qwqwq,题解就不多说了. 代码如下: #include<iostream> #include<cstdio> #include ...
- 主席树学习笔记(静态区间第k大)
题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入输出 ...
- Splay伸展树学习笔记
Splay伸展树 有篇Splay入门必看文章 —— CSDN链接 经典引文 空间效率:O(n) 时间效率:O(log n)插入.查找.删除 创造者:Daniel Sleator 和 Robert Ta ...
- CART分类与回归树 学习笔记
CART:Classification and regression tree,分类与回归树.(是二叉树) CART是决策树的一种,主要由特征选择,树的生成和剪枝三部分组成.它主要用来处理分类和回归问 ...
- Trie树 字典树-学习笔记
字符串--蒟蒻永远的阴影 对于字符串匹配 KMP很好的解决了以一个文本串匹配一个模板串的问题 但如果模板串有多个呢 这是KMP不再适用 我们引入一个新的数据结构--字典树 (当然又有像AC自动机这样更 ...
- 一篇自己都看不懂的点分治&点分树学习笔记
淀粉质点分治可真是个好东西 Part A.点分治 众所周知,树上分治算法有$3$种:点分治.边分治.链分治(最后一个似乎就是树链剖分),它们名字的不同是由于分治方式的不同的.点分治,顾名思义,每一次选 ...
随机推荐
- BZOJ3529: [Sdoi2014]数表 莫比乌斯反演_树状数组
Code: #include <cstdio> #include <algorithm> #include <cstring> #define ll long lo ...
- 说说Shell在代码重构中的应用
说说Shell在代码重构中的应用 出处信息 出处:http://blogread.cn/it/article/3426?f=wb 代码重构(Code refactoring)有时是很枯燥的,字符 ...
- Lumen5.5,使用laravel excel 下载 、导入excel文件
1.安装 首先是安装laravel excel,使用composer安装 composer require maatwebsite/excel ~2.1.0 2.配置 在bootstrap/app.p ...
- Vue系列(一):简介、起步、常用指令、事件和属性、模板、过滤器
一. Vue.js简介 1. Vue.js是什么 Vue.js也称为Vue,读音/vju:/,类似view,错误读音v-u-e 是一个轻量级MVVM(Model-View-ViewModel)框架,和 ...
- [LeetCode] 242. 有效的字母异位词 valid-anagram(排序)
注意这里字母异位词的定义是:字母类别及个数都要一样,只是排列顺序不同. class Solution(object): def isAnagram(self, s, t): ""& ...
- Redis:基础知识及其常用数据类型和关键字
Redis: Redis是什么: REmote DIctionary Server(远程字典服务器) 是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(Key-Value)分布式内存数 ...
- SpringBoot 消费NSQ消息
使用监听器,来实现实时消费nsq的消息 一.目前spring boot中支持的事件类型如下 ApplicationFailedEvent:该事件为spring boot启动失败时的操作 Applica ...
- maven这些工具负责创建项目,然后maven负责打包好war包扔进tomcat容器,tomcat容器接受的只是jar包
maven这些工具负责创建项目,然后maven负责打包好war包扔进tomcat容器,tomcat容器接受的只是jar包 2.tomcat不管你什么编译的,也不管你开发工具是什么.Tomcat只接受w ...
- YAML说明
YAML说明 https://www.cnblogs.com/songchaoke/p/3376323.html XML的简化
- UVA 436 - Arbitrage (II)(floyd)
UVA 436 - Arbitrage (II) 题目链接 题意:给定一些国家货币的汇率.问是否能通过不断换货币使钱得到增长 思路:floyd,完事后推断一下有没有连到自己能大于1的情况 代码: #i ...