博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NOIP2017 列队——平衡树
阅读量:6582 次
发布时间:2019-06-24

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

平衡树蒟蒻,敲了半天。

其实思路很简单,就是把许多个人合并成一个区间。必要的时候再拆开。(是不是和这个题的动态开点线段树有异曲同工之妙?)

每次操作最多多出来6个点。

理论上时间复杂度是nlogn,空间复杂度实际远远小于上界,其实4*n即可。

出错点:

1.pushup把哨兵sz变成了1:pushup要特判x!=0(比较保险)

2.fa和son的边一定要成对一起添加!!t[t[y].ch[0]=t[x].ch[0]].fa=y 压行的话不容易漏。

3.对于一列的情况,可能删除之后整个树空了。但是如果直接找的话,因为哨兵0有奇奇怪怪的左右儿子和father,所以,一路上会把0的sz变成1,并且访问到奇奇怪怪的点23333

那就特判如果没有根的话,那就直接建立即可。

 

代码:

 

#include
#define reg register int#define il inlineusing namespace std;typedef long long ll;const int N=300000+5;struct node{ int ch[2]; int sz; int L,R; int fa; ll val;}t[N*6];int tot;void rd(int &x){ char ch;x=0; while(!isdigit(ch=getchar())); for(x=ch^'0';isdigit(ch=getchar());x=x*10+(ch^'0'));}int rt[N];int now;int n,m,q;void pushup(int x){ if(x) t[x].sz=t[t[x].ch[0]].sz+t[t[x].ch[1]].sz+t[x].R-t[x].L+1;}void rotate(int x){ int y=t[x].fa,d=(t[y].ch[1]==x); t[t[y].ch[d]=t[x].ch[!d]].fa=y; t[t[x].fa=t[y].fa].ch[t[t[y].fa].ch[1]==y]=x; t[t[x].ch[!d]=y].fa=x; pushup(y);}void splay(int x,int f){ while(t[x].fa!=f){ int y=t[x].fa,z=t[y].fa; if(z!=f){ rotate((t[y].ch[0]==x)==(t[z].ch[0]==y)?y:x); } rotate(x); } pushup(x); if(f==0) rt[now]=x;}ll get(int pos){ if(now==n+1){ return (ll)pos*m; } return (ll)(now-1)*m+pos;}void ins(int x,ll c){ if(x==0){ ++tot; t[tot].fa=0; t[tot].val=c; t[tot].L=t[tot].R=0; pushup(tot); rt[now]=tot; } else{ while(t[x].ch[1]) t[x].sz++,x=t[x].ch[1]; ++tot; t[x].ch[1]=tot; t[tot].fa=x; t[tot].L=t[tot].R=0;t[tot].val=c; t[tot].sz=1; pushup(x); splay(tot,0); int tmp=rt[now]; }}ll query(int x,int k){
//and dele int d=k-t[t[x].ch[0]].sz; if(d<=0) return query(t[x].ch[0],k); else if(t[x].R-t[x].L+1
t[x].L){ if(d>1){ ++tot; t[tot].L=t[x].L;t[tot].R=t[x].L+d-2; t[t[tot].ch[0]=t[x].ch[0]].fa=tot; t[t[x].ch[0]=tot].fa=x; pushup(tot); } if(d

 

转载于:https://www.cnblogs.com/Miracevin/p/9898179.html

你可能感兴趣的文章
加密和解密基础
查看>>
三元表达式
查看>>
架构设计:生产者/消费者模式 第2页:如何确定数据单元
查看>>
RHCS
查看>>
C# 获取文件MD5与SHA1
查看>>
【源资讯 第25期】一波开源项目将停止维护
查看>>
IO 多路服用模型
查看>>
硬盘的读写原理
查看>>
STP-生成树协议-在交换网络中,存在备份链路的情况,防止2层数据转发环路的发生。...
查看>>
Java 核心内容相关面试题【4】
查看>>
部署自动化运维服务——Ansible
查看>>
SnapKit使用
查看>>
使用Windows 10的附近共享共享文件
查看>>
性能监控(3)&ndash;linux下的iostat命令
查看>>
铸件成型工艺设计
查看>>
[linux]【常用命令】
查看>>
2018年视频云服务市场格局进入整合阶段,阿里云视频云位居市场竞争力领导者的位置...
查看>>
红米Note 4怎么样刷入开发版启用Root权限
查看>>
centOS 7磁盘管理
查看>>
面试官:看你简历写了熟悉Kafka,它为什么速度会这么快?
查看>>