bzoj1861 [Zjoi2006]Book 书架

题目链接

调了好久,要崩溃了。

splay入门题

注意虚拟结点

并不知道为什么加了空间回收就要T三组???

  1 #include<algorithm>
  2 #include<iostream>
  3 #include<cstdlib>
  4 #include<cstring>
  5 #include<cstdio>
  6 #include<string>
  7 #include<cmath>
  8 #include<ctime>
  9 #include<queue>
 10 #include<stack>
 11 #include<map>
 12 #include<set>
 13 #define rre(i,r,l) for(int i=(r);i>=(l);i--)
 14 #define re(i,l,r) for(int i=(l);i<=(r);i++)
 15 #define Clear(a,b) memset(a,b,sizeof(a))
 16 #define inout(x) printf("%d",(x))
 17 #define douin(x) scanf("%lf",&x)
 18 #define strin(x) scanf("%s",(x))
 19 #define LLin(x) scanf("%lld",&x)
 20 #define op operator
 21 #define CSC main
 22 typedef unsigned long long ULL;
 23 typedef const int cint;
 24 typedef long long LL;
 25 using namespace std;
 26 void inin(int &ret)
 27 {
 28     ret=0;int f=0;char ch=getchar();
 29     while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();}
 30     while(ch>='0'&&ch<='9')ret*=10,ret+=ch-'0',ch=getchar();
 31     ret=f?-ret:ret;
 32 }
 33 int ch[160016][2],w[160016],s[160016],ed,fa[160016],wei[160016],root;
 34 void maintain(int k){if(k)s[k]=s[ch[k][0]]+s[ch[k][1]]+1;}
 35 void rotate(int x)
 36 {
 37     int y=fa[x],z=fa[y];
 38     if(z)ch[z][ch[z][1]==y]=x;
 39     int l=ch[y][1]==x,r=l^1;
 40     fa[y]=x,fa[x]=z;
 41     if(ch[x][r])fa[ch[x][r]]=y;
 42     ch[y][l]=ch[x][r],ch[x][r]=y;
 43     maintain(y);
 44 }
 45 int newnode(int v,int f)
 46 {
 47     int ret=++ed;
 48     s[ret]=1,w[ret]=v;fa[ret]=f;
 49     ch[ret][0]=ch[ret][1]=0;
 50     wei[v]=ret;
 51     return ret;
 52 }
 53 int com(int k,int x)
 54 {
 55     int pp=s[ch[k][0]]+1;
 56     if(x==pp)return -1;
 57     return x<pp?0:1;
 58 }
 59 void splay(int x,int f)
 60 {
 61     if(!x)return ; 
 62     while(fa[x]!=f)
 63     {
 64         int y=fa[x],z=fa[y];
 65         if(z!=f)
 66             if((ch[z][1]==y)^(ch[y][1]==x))rotate(x);
 67             else rotate(y);else ;
 68         rotate(x);
 69     }
 70     maintain(x);
 71     if(!f)root=x;
 72 }
 73 int kth(int k)
 74 {
 75     int x=root;
 76     while(x)
 77     {
 78         int pp=s[ch[x][0]]+1;
 79         if(pp==k)return x;
 80         if(pp<k)k-=pp,x=ch[x][1];
 81         else x=ch[x][0];
 82     }return 0;
 83 }
 84 int a[80080];
 85 int build(int f,int l,int r)
 86 {
 87     if(l>r)return 0;
 88     int mid=(l+r)>>1;
 89     int k=newnode(a[mid],f);
 90     ch[k][0]=build(k,l,mid-1);
 91     ch[k][1]=build(k,mid+1,r);
 92     maintain(k);return k;
 93 }
 94 int split(int l,int r)
 95 {
 96     int x=kth(l-1),y=kth(r+1);
 97     splay(x,0),splay(y,x);
 98     return ch[y][0];
 99 }
100 int find(int k,int x)
101 {
102     if(!k)return 0;
103     int pp=s[ch[k][0]];
104     if(x>pp+1)return find(ch[k][1],x-pp-1);
105     if(x<=pp)return find(ch[k][0],x);
106     else return k;
107 }
108 void Top(int x)
109 {
110     int L=find(root,2);
111     splay(L,0);
112     ch[ch[root][0]][1]=wei[x];fa[wei[x]]=ch[root][0];
113     ch[wei[x]][0]=ch[wei[x]][1]=0;
114     maintain(wei[x]),maintain(ch[root][0]),maintain(root);
115 }
116 void B(int x)
117 {
118     int L=find(root,s[root]-1);
119     splay(L,0);
120     ch[ch[root][1]][0]=wei[x];fa[wei[x]]=ch[root][1];
121     ch[wei[x]][0]=ch[wei[x]][1]=0;
122     maintain(wei[x]);maintain(ch[root][1]);maintain(root);
123 }
124 int maxi(int x)
125 {
126     if(!x)return 0;
127     while(ch[x][1])x=ch[x][1];
128     return x;
129 }
130 void del(int x)
131 {
132     splay(wei[x],0);splay(maxi(ch[root][0]),0);
133     fa[ch[wei[x]][1]]=root;ch[root][1]=ch[wei[x]][1];
134     maintain(root);
135 }
136 int n,m;
137 void print(int x)
138 {
139     if(!x)return ;
140     print(ch[x][0]);
141     printf("%d ",w[x]);
142     print(ch[x][1]);
143 }
144 int CSC()
145 {
146     freopen("in.in","r",stdin);
147     freopen("out.out","w",stdout);
148     inin(n),inin(m);
149     re(i,1,n)inin(a[i]);
150     root=build(0,0,n+1);
151     char opt[22];
152     re(i,1,m)
153     {
154         strin(opt);int x;inin(x);
155         if(opt[0]=='T')
156         {
157             del(x);
158             Top(x);
159         }
160         if(opt[0]=='B')
161         {
162             del(x);
163             B(x);
164         }
165         if(opt[0]=='I')
166         {
167             int t;inin(t);
168             if(!t)continue;
169             int k=wei[x];
170             splay(k,0);
171             int rank=s[ch[k][0]]+t;
172             del(x);
173             int L=find(root,rank),R=find(root,rank+1);
174             splay(L,0);splay(R,root);
175             ch[ch[root][1]][0]=wei[x];fa[wei[x]]=ch[root][1];
176             ch[wei[x]][0]=ch[wei[x]][1]=0;
177             maintain(wei[x]);maintain(ch[root][1]);maintain(root);
178         }
179         if(opt[0]=='A')
180         {
181             int k=wei[x];
182             splay(k,0);
183             int kk=s[ch[k][0]]-1;
184             printf("%d
",kk);
185         }
186         if(opt[0]=='Q')
187         {
188             int k=find(root,x+1);
189             splay(k,0);
190             printf("%d
",w[root]);
191         }
192 //        print(root);cout<<"
";
193     }
194     return 0;
195 }
原文地址:https://www.cnblogs.com/HugeGun/p/5156544.html