博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解题:洛谷3835 可持久化平衡树
阅读量:4460 次
发布时间:2019-06-08

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

题面

其实就是在Merge和Split的时候换成新建节点,然后把原来的节点整个拷到新的节点一份继续做

1 #include
2 #include
3 #include
4 using namespace std; 5 const int N=500005,inf=2147483647; 6 int root[N],siz[N*50],son[N*50][2],rnk[N*50],val[N*50]; 7 int n,x,y,z,t1,t2,t3,tot; 8 void Copy(int a,int b) 9 { 10 son[a][0]=son[b][0]; 11 son[a][1]=son[b][1]; 12 siz[a]=siz[b],rnk[a]=rnk[b],val[a]=val[b]; 13 } 14 void Pushup(int nde) 15 { 16 siz[nde]=siz[son[nde][0]]+siz[son[nde][1]]+1; 17 } 18 int Create(int tsk) 19 { 20 siz[++tot]=1; 21 val[tot]=tsk; 22 rnk[tot]=rand(); 23 return tot; 24 } 25 int Merge(int x,int y) 26 { 27 if(!x||!y) return x+y; 28 else if(rnk[x]<=rnk[y]) 29 { 30 int newn=++tot; Copy(newn,x); 31 son[newn][1]=Merge(son[newn][1],y); 32 Pushup(newn); return newn; 33 } 34 else 35 { 36 int newn=++tot; Copy(newn,y); 37 son[newn][0]=Merge(x,son[newn][0]); 38 Pushup(newn); return newn; 39 } 40 } 41 void Split(int nde,int &x,int &y,int tsk) 42 { 43 if(!nde) x=y=0; 44 else 45 { 46 if(val[nde]<=tsk) 47 { 48 x=++tot,Copy(x,nde); 49 Split(son[x][1],son[x][1],y,tsk); 50 Pushup(x); 51 } 52 else 53 { 54 y=++tot,Copy(y,nde); 55 Split(son[y][0],x,son[y][0],tsk); 56 Pushup(y); 57 } 58 } 59 } 60 int Query(int nde,int tsk) 61 { 62 if(tsk<=siz[son[nde][0]]) return Query(son[nde][0],tsk); 63 else if(tsk==siz[son[nde][0]]+1) return nde; 64 else return Query(son[nde][1],tsk-siz[son[nde][0]]-1); 65 } 66 void Insert(int &trt,int tsk) 67 { 68 Split(trt,x,y,tsk); 69 trt=Merge(Merge(x,Create(tsk)),y); 70 } 71 void Delete(int &trt,int tsk) 72 { 73 Split(trt,x,z,tsk),Split(x,x,y,tsk-1); 74 trt=Merge(Merge(x,Merge(son[y][0],son[y][1])),z); 75 } 76 int rnk_query(int &trt,int tsk) 77 { 78 Split(trt,x,y,tsk-1); 79 int ret=siz[x]+1; 80 trt=Merge(x,y); return ret; 81 } 82 int num_query(int &trt,int tsk) 83 { 84 return val[Query(trt,tsk)]; 85 } 86 int pre_query(int &trt,int tsk) 87 { 88 Split(trt,x,y,tsk-1); 89 int ret=val[Query(x,siz[x])]; 90 trt=Merge(x,y); 91 return x?ret:-inf; 92 } 93 int nxt_query(int &trt,int tsk) 94 { 95 Split(trt,x,y,tsk); 96 int ret=val[Query(y,1)]; 97 trt=Merge(x,y); 98 return y?ret:inf; 99 }100 int main()101 {102 srand(20020513);103 scanf("%d",&n);104 for(int i=1;i<=n;i++)105 {106 scanf("%d%d%d",&t1,&t2,&t3),root[i]=root[t1];107 if(t2==1) Insert(root[i],t3);108 else if(t2==2) Delete(root[i],t3);109 else if(t2==3) printf("%d\n",rnk_query(root[i],t3));110 else if(t2==4) printf("%d\n",num_query(root[i],t3));111 else if(t2==5) printf("%d\n",pre_query(root[i],t3));112 else if(t2==6) printf("%d\n",nxt_query(root[i],t3));113 }114 return 0;115 }
View Code

 

转载于:https://www.cnblogs.com/ydnhaha/p/10010909.html

你可能感兴趣的文章
c++小游戏——五子棋
查看>>
浏览器全屏非全屏切换
查看>>
2.CSS 颜色代码大全
查看>>
Native与H5交互的一些解决方法
查看>>
三、基于hadoop的nginx访问日志分析--计算时刻pv
查看>>
SpringCloud Config客户端
查看>>
OAuth 开放授权 Open Authorization
查看>>
MongoDb数据库设计
查看>>
矩阵的线性代数意义
查看>>
最大似然估计(Maximum likelihood estimation)(通过例子理解)
查看>>
设计模式的六大原则
查看>>
/var/spool/postfix/maildrop 占用inode索引及磁盘空间解决办法
查看>>
urlRewrite url重写
查看>>
团队冲刺第六天
查看>>
淀粉质(点分治) 学习笔记
查看>>
Jenkins api java 调用
查看>>
integer promotion
查看>>
C语言Linux服务器网络爬虫项目(二)项目设计和通过一个http请求抓取网页的简单实现...
查看>>
图片预加载 解决图片加载闪动问题
查看>>
怎么处理系统蓝屏后提示代码0x000000d1的错误?
查看>>