ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

UVA - 12538 Version Controlled IDE (可持久化treap)

2019-07-30 10:01:14  阅读:249  来源: 互联网

标签:rt mg Controlled 40 int sp 12538 treap dfs


紫薯例题

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int N=1e6+10,inf=0x3f3f3f3f;
 5 int rt[N],siz[N*40],ch[N*40][2],tot,n,d,ver;
 6 char buf[N],val[N*40];
 7 #define l(u) ch[u][0]
 8 #define r(u) ch[u][1]
 9 int rnd() {
10     const int M=(1ll<<31)-1,X=19260817;
11     static int seed=time(0)%M;
12     return seed=(ll)seed*X%M;
13 }
14 int newnode(char c) {int u=++tot; siz[u]=1,l(u)=r(u)=0,val[u]=c; return u;}
15 int cpy(int v) {int u=++tot; siz[u]=siz[v],l(u)=l(v),r(u)=r(v),val[u]=val[v]; return u;}
16 void pu(int u) {siz[u]=siz[l(u)]+siz[r(u)]+1;}
17 void sp(int w,int k,int& u,int& v) {
18     if(!w) {u=v=0; return;}
19     if(k<=siz[l(w)])v=cpy(w),sp(l(w),k,u,l(v)),pu(v);
20     else u=cpy(w),sp(r(w),k-(siz[l(w)]+1),r(u),v),pu(u);
21 }
22 void mg(int& w,int u,int v) {
23     if(!u||!v) {w=u|v; return;}
24     if(rnd()%(siz[u]+siz[v])<siz[u])w=u,mg(r(w),r(u),v);
25     else w=v,mg(l(w),u,l(v));
26     pu(w);
27 }
28 void build(int& u,int l,int r) {
29     if(l>r) {u=0; return;}
30     int mid=(l+r)>>1;
31     u=newnode(buf[mid]);
32     build(l(u),l,mid-1),build(r(u),mid+1,r),pu(u);
33 }
34 void ins(int& rt,int p) {
35     int n=strlen(buf);
36     int L,M,R;
37     build(M,0,n-1);
38     sp(rt,p,L,R),mg(L,L,M),mg(rt,L,R);
39 }
40 void del(int& rt,int p,int c) {
41     int L,M,R;
42     sp(rt,p+c-1,L,R),sp(L,p-1,L,M),mg(rt,L,R);
43 }
44 void dfs(int u) {
45     if(!u)return;
46     dfs(l(u)),putchar(val[u]),dfs(r(u));
47     if(val[u]=='c')++d;
48 }
49 void pr(int& rt,int p,int c) {
50     int L,M,R;
51     sp(rt,p+c-1,L,R),sp(L,p-1,L,M);
52     dfs(M),puts("");
53     mg(L,L,M),mg(rt,L,R);
54 }
55 int main() {
56     scanf("%d",&n);
57     for(int i=1; i<=n; ++i) {
58         int f;
59         scanf("%d",&f);
60         if(f==1) {
61             int p;
62             scanf("%d%s",&p,buf),p-=d;
63             ++ver,ins(rt[ver]=rt[ver-1],p);
64         } else if(f==2) {
65             int p,c;
66             scanf("%d%d",&p,&c),p-=d,c-=d;
67             ++ver,del(rt[ver]=rt[ver-1],p,c);
68         } else {
69             int v,p,c;
70             scanf("%d%d%d",&v,&p,&c),v-=d,p-=d,c-=d;
71             pr(rt[v],p,c);
72         }
73     }
74     return 0;
75 }

 

标签:rt,mg,Controlled,40,int,sp,12538,treap,dfs
来源: https://www.cnblogs.com/asdfsag/p/11268200.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有