博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ4605 : 崂山白花蛇草水
阅读量:6598 次
发布时间:2019-06-24

本文共 2821 字,大约阅读时间需要 9 分钟。

外层维护权值线段树,内层维护kd-tree。

修改的时候只往右儿子里插入,不平衡的时候替罪羊式重构。

查询的时候在外层线段树上走,在内层kd-tree上查询矩形内点数即可。

时间复杂度$O(q\log v(\log^2q+\sqrt{q}))$。

 

#include
#include
#include
using namespace std;const double A=0.8;const int N=100010,M=1600010;inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}int n,ans,cmp_d,op,X1,Y1,X2,Y2,k;int tmp[N],deep,need[N],cnt,cur;int T[M],l[M],r[M],tot=1;struct node{int d[2],l,r,Max[2],Min[2],size;}t[M];inline bool cmp(int a,int b){return t[a].d[cmp_d]
b)a=b;}inline void up(int x){ t[x].size=1+t[t[x].l].size+t[t[x].r].size; if(t[x].l){ umax(t[x].Max[0],t[t[x].l].Max[0]); umin(t[x].Min[0],t[t[x].l].Min[0]); umax(t[x].Max[1],t[t[x].l].Max[1]); umin(t[x].Min[1],t[t[x].l].Min[1]); } if(t[x].r){ umax(t[x].Max[0],t[t[x].r].Max[0]); umin(t[x].Min[0],t[t[x].r].Min[0]); umax(t[x].Max[1],t[t[x].r].Max[1]); umin(t[x].Min[1],t[t[x].r].Min[1]); }}int build(int l,int r,int D){ int mid=(l+r)>>1; cmp_d=D; nth_element(need+l+1,need+mid+1,need+r+1,cmp); int x=need[mid]; t[x].Max[0]=t[x].Min[0]=t[x].d[0]; t[x].Max[1]=t[x].Min[1]=t[x].d[1]; if(l!=mid)t[x].l=build(l,mid-1,!D);else t[x].l=0; if(r!=mid)t[x].r=build(mid+1,r,!D);else t[x].r=0; up(x); return x;}void dfs(int x){if(x)need[++cnt]=x,dfs(t[x].l),dfs(t[x].r);}inline void ins(int&root,int now){ if(!root){root=now;return;} for(int D=deep=0,x=root;;D^=1){ tmp[++deep]=x; umax(t[x].Max[0],t[now].Max[0]); umax(t[x].Max[1],t[now].Max[1]); umin(t[x].Min[0],t[now].Min[0]); umin(t[x].Min[1],t[now].Min[1]); t[x].size++; if(t[now].d[D]>=t[x].d[D]){ if(!t[x].r){t[x].r=now;break;}else x=t[x].r; }else{ if(!t[x].l){t[x].l=now;break;}else x=t[x].l; } } tmp[++deep]=now; if(deep
X2||t[x].Max[1]
Y2||ans>=k)return; if(t[x].Min[0]>=X1&&t[x].Max[0]<=X2&&t[x].Min[1]>=Y1&&t[x].Max[1]<=Y2){ans+=t[x].size;return;} if(t[x].d[0]>=X1&&t[x].d[0]<=X2&&t[x].d[1]>=Y1&&t[x].d[1]<=Y2)ans++; ask(t[x].l);ask(t[x].r);}inline void add(){ int x=1,a=1,b=1000000000,mid,flag=1; while(1){ if(flag){ cur++; t[cur].Max[0]=t[cur].Min[0]=t[cur].d[0]=X1; t[cur].Max[1]=t[cur].Min[1]=t[cur].d[1]=Y1; t[cur].size=1; ins(T[x],cur); } if(a==b)return; mid=(a+b)>>1; if(k<=mid){ if(!l[x])l[x]=++tot; x=l[x],b=mid,flag=0; }else{ if(!r[x])r[x]=++tot; x=r[x],a=mid+1,flag=1; } }}inline void query(){ ans=0,ask(T[1]); if(ans
>1; ans=0,ask(T[r[x]]); if(ans>=k)x=r[x],a=mid+1;else k-=ans,x=l[x],b=mid; } printf("%d\n",ans=a);}int main(){ read(n),read(n); while(n--){ read(op),read(X1),read(Y1);X1^=ans,Y1^=ans; if(op==1){ read(k);k^=ans; add(); }else{ read(X2),read(Y2),read(k);X2^=ans;Y2^=ans;k^=ans; query(); } } return 0;}

  

转载地址:http://ylpio.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
windows网络安全以及常见网络***方式
查看>>
警告 初始化默认驱动器时出错“找不到运行 Active Directory Web 服务的默认服务器。”...
查看>>
js 验证中文
查看>>
Linux下运行java DES AES加解密
查看>>
牛津词典 2018 年度词汇 ——「有毒」!
查看>>
Android Arcface人脸识别sdk使用工具类
查看>>
android studio单个工程文件的代理设置
查看>>
我的友情链接
查看>>
一行命令获取当前JVM所有可设置的参数以及当前默认值
查看>>
Red Hat EnterPrise Linux 5.4下web服务器的综合使用(普通站点、虚拟主机、安全性、...
查看>>
unbantu安装 mysql --- 百度云
查看>>
JS中的默认行为
查看>>
从oracle到mysql,主从到分库,一个普通项目数据库架构的变迁
查看>>
selenium层级定位及鼠标键盘操作
查看>>
SpringBoot跨域问题解决方案
查看>>
46、练习:输出指定目录下的所有文件名称
查看>>
IP地址与数字地址相互转换
查看>>
字符串连接[不用库函数]
查看>>
新建一个express工程,node app无反应
查看>>