简单题(K-D Tree)
简单题不简单……
我们把单点加操作改成插入一个权值为增加量的点,将问题转化成询问一个矩阵中所有点的和,用 \(K-D\ Tree\) 维护,时间复杂度 \(O(n\sqrt{n})\)
\(Code\ Below:\)
// luogu-judger-enable-o2
#include <bits/stdc++.h>
using namespace std;
const int maxn=500000+10;
const double alpha=0.75;
int n,D,rt,cnt,tot,rub[maxn],top;
struct node{
int d[2],val;
}a[maxn];
inline bool operator < (const node &a,const node &b){
return a.d[D]<b.d[D];
}
struct KD_Tree{
int d[2],Max[2],Min[2],ch[2],val,siz,sum;
inline void init(){
d[0]=d[1]=Max[0]=Max[1]=Min[0]=Min[1]=ch[0]=ch[1]=val=siz=sum=0;
}
inline void get(node a){
Max[0]=Min[0]=d[0]=a.d[0];
Max[1]=Min[1]=d[1]=a.d[1];
siz=1;val=sum=a.val;
}
}t[maxn];
inline int read(){
register int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return (f==1)?x:-x;
}
inline int newnode(){
int x=top?rub[top--]:++cnt;
t[x].init();return x;
}
inline void update(int x,int y){
t[x].Max[0]=max(t[x].Max[0],t[y].Max[0]);
t[x].Max[1]=max(t[x].Max[1],t[y].Max[1]);
t[x].Min[0]=min(t[x].Min[0],t[y].Min[0]);
t[x].Min[1]=min(t[x].Min[1],t[y].Min[1]);
}
inline void pushup(int x){
t[x].siz=t[t[x].ch[0]].siz+t[t[x].ch[1]].siz+1;
t[x].sum=t[t[x].ch[0]].sum+t[t[x].ch[1]].sum+t[x].val;
if(t[x].ch[0]) update(x,t[x].ch[0]);
if(t[x].ch[1]) update(x,t[x].ch[1]);
}
int build(int l,int r,int now){
int mid=(l+r)>>1,x=newnode();D=now;
nth_element(a+l,a+mid,a+r+1);
t[x].get(a[mid]);
if(l<mid) t[x].ch[0]=build(l,mid-1,now^1);
if(mid<r) t[x].ch[1]=build(mid+1,r,now^1);
pushup(x);return x;
}
void del(int x){
if(t[x].ch[0]) del(t[x].ch[0]);
a[++tot].d[0]=t[x].d[0];
a[tot].d[1]=t[x].d[1];
a[tot].val=t[x].val;
rub[++top]=x;
if(t[x].ch[1]) del(t[x].ch[1]);
}
void check(int &x,int now){
if(1.0*max(t[t[x].ch[0]].siz,t[t[x].ch[1]].siz)>1.0*alpha*t[x].siz)
tot=0,del(x),x=build(1,tot,now);
}
void insert(int &x,node c,int now){
if(!x){
x=newnode();
t[x].get(c);
return ;
}
if(c.d[now]<=t[x].d[now]) insert(t[x].ch[0],c,now^1);
else insert(t[x].ch[1],c,now^1);
pushup(x);check(x,now);
}
int query(int x,int x1,int x2,int y1,int y2){
if(t[x].Max[0]<x1||t[x].Min[0]>x2||t[x].Max[1]<y1||t[x].Min[1]>y2) return 0;
if(t[x].Max[0]<=x2&&t[x].Min[0]>=x1&&t[x].Max[1]<=y2&&t[x].Min[1]>=y1) return t[x].sum;
int ans=0;
if(t[x].d[0]<=x2&&t[x].d[0]>=x1&&t[x].d[1]<=y2&&t[x].d[1]>=y1) ans=t[x].val;
if(t[x].ch[0]) ans+=query(t[x].ch[0],x1,x2,y1,y2);
if(t[x].ch[1]) ans+=query(t[x].ch[1],x1,x2,y1,y2);
return ans;
}
int main()
{
n=read();
int op,x,y,z,x1,x2,y1,y2,lastans=0;
while(1){
op=read();
if(op==1){
x=read()^lastans,y=read()^lastans,z=read()^lastans;
insert(rt,(node){x,y,z},0);
}
if(op==2){
x1=read()^lastans,y1=read()^lastans,x2=read()^lastans,y2=read()^lastans;
printf("%d\n",lastans=query(rt,x1,x2,y1,y2));
}
if(op==3) break;
}
return 0;
}
简单题(K-D Tree)的更多相关文章
- Luogu P4148 简单题(K-D Tree)
题面 题解 因为强制在线,所以我们不能$cdq$分治,所以考虑用$KDT$,$KDT$维护一个矩阵,然后询问的时候如果当前矩形在询问区间内,直接记贡献,否则判断当前点是否在矩阵内,然后左右分别递归下去 ...
- BZOJ4066:简单题(K-D Tree)
Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x,y<=N,A是正整数 ...
- acm.njupt 1001-1026 简单题
点击可展开上面目录 Acm.njupt 1001-1026简单题 第一页许多是简单题,每题拿出来说说,没有必要,也说不了什么. 直接贴上AC的代码.初学者一题题做,看看别人的AC代码,寻找自己的问题. ...
- BZOJ 2683: 简单题
2683: 简单题 Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 913 Solved: 379[Submit][Status][Discuss] ...
- 【BZOJ-1176&2683】Mokia&简单题 CDQ分治
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1854 Solved: 821[Submit][St ...
- Bzoj4066 简单题
Time Limit: 50 Sec Memory Limit: 20 MBSubmit: 2185 Solved: 581 Description 你有一个N*N的棋盘,每个格子内有一个整数,初 ...
- Bzoj2683 简单题
Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 1071 Solved: 428 Description 你有一个N*N的棋盘,每个格子内有一个整数, ...
- 又一道简单题&&Ladygod(两道思维水题)
Ladygod Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit S ...
- (hdu 简单题 128道)平方和与立方和(求一个区间的立方和和平方和)
题目: 平方和与立方和 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
随机推荐
- Ajax在jQuery中的应用 (4)向jsp提交表单数据
ajax技术带给我们的是良好的用户体验,同时,使用jquery可以简化开发,提高工作效率. 下面就介绍一下大致的开发步骤. 工具/原料 本文中使用的是 jquery-1.3.2.min.js 方法/步 ...
- spring 学习 二 IOC/DI
中文名称:控制反转 英文名称:( Inversion of Control ) 1 控制反转作用: 一般在编写java程序时,需要程序员自己创建对象的实例,例如 A a=new A();语句,就是程序 ...
- Visual Studio 2015部署OpenCV
Visual Studio 2015的安装破解及OpenCV的安装和部署 平台:win10 X64+VS2015专业版 X64:vs2015.pro_chs+OpenCV 3.X:opencv-3.4 ...
- 通过http.client解析url返回的数据时为什么中文变成了unicode码
今天在解析json数据的时候得到了一堆这样的数据:{"errNum":0,"errMsg":"success","retData& ...
- 2018.11.24 spoj New Distinct Substrings(后缀数组)
传送门 双倍经验(弱化版本) 考虑求出来heightheightheight数组之后用增量法. 也就是考虑每增加一个heightheightheight对答案产生的贡献. 算出来是∑∣S∣−heigh ...
- Apache和nginx 域名配置
apache配置 一.hosts配置: 1.用编辑器打开hosts文件,位置:C:\Windows\System32\drivers\etc目录下 2.在hosts文件里添加自己的域名配置,配置规则如 ...
- springboot深入学习(五)-----spring data、事务
spring data项目是spring解决数据访问问题的一系列解决方案,包含了大量关系型数据库以及非关系型数据库的访问解决方案. 一.spring data jpa 1.简介 jpa是一套规范,不提 ...
- Jquery 单击_双击_鼠标经过_鼠标离开_背景样式变化
列表页点击.鼠标经过离开背景变化 <script type="text/javascript"> $(function () { $("table tr&qu ...
- 20145232 韩文浩 《Java程序设计》第10周学习总结
13.1 网络概述 13.1.1计算机网络概述 网络编程的实质:两个(或多个)设备(例如计算机)之间的数据传输. 计算机网络的定义:通过一定的物理设备将处于不同位置的计算机连接起来组成的网络,这个网络 ...
- 20155326 实验四 Android程序设计实验报告
20155326 实验四 Android程序设计实验报告 实验内容 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android.组件.布局管理器的使用: 3. ...