BZOJ 1861 书架(splay)

来源:互联网 发布:linux tomcat安装版 编辑:程序博客网 时间:2024/05/02 00:25

题目链接:点击打开链接

这道题我又是用来水模板的。。。再膜拜hzwer神犇。。。

#include<cstdio>#include<cstring>#include<iostream>using namespace std;#define inf (1e9)#define maxn (80000+5)int N,M,root;int a[maxn],f[maxn],c[maxn][2],v[maxn],size[maxn],pos[maxn];void update(int x){size[x]=size[c[x][0]]+size[c[x][1]]+1;}void built(int L,int R,int F){if(L>R)return ;if(L==R){v[L]=a[L]; f[L]=F; size[L]=1;if(L>F)c[F][1]=L; else c[F][0]=L;return ;}int mid=(L+R)>>1;built(L,mid-1,mid); built(mid+1,R,mid);v[mid]=a[mid]; f[mid]=F; update(mid);if(mid>F)c[F][1]=mid; else c[F][0]=mid;}void rotate(int x,int &k){int y=f[x],z=f[y],l,r;if(c[y][0]==x)l=0; else l=1; r=l^1;if(y==k)k=x;else{if(c[z][0]==y)c[z][0]=x;else c[z][1]=x;}f[x]=z; f[y]=x; f[c[x][r]]=y;c[y][l]=c[x][r]; c[x][r]=y;update(y); update(x);}void splay(int x,int &k){while(x!=k){int y=f[x],z=f[y];if(y!=k){if((c[y][0]==x)==(c[z][0]==y))rotate(y,k);else rotate(x,k);}rotate(x,k);}}int find(int x,int rank){int l=c[x][0],r=c[x][1];if(size[l]+1==rank)return x;else if(size[l]>=rank)return find(l,rank);else return find(r,rank-size[l]-1);}void del(int k){int x,y,z;x=find(root,k-1); y=find(root,k+1);splay(x,root); splay(y,c[x][1]);z=c[y][0]; c[y][0]=0; f[z]=size[z]=0;update(y); update(x);}void move(int k,int V){//先删除,再插入int x,y,z=pos[k],rank;splay(z,root); rank=size[c[z][0]]+1;del(rank);if(V==inf)x=find(root,N),y=find(root,N+1);else if(V==-inf)x=find(root,1),y=find(root,2);else x=find(root,rank+V-1),y=find(root,rank+V);splay(x,root); splay(y,c[x][1]);size[z]=1; f[z]=y; c[y][0]=z;update(y); update(x);}void solve(){scanf("%d%d",&N,&M);for(int i=2;i<=N+1;i++)scanf("%d",&a[i]),pos[a[i]]=i;built(1,N+2,0); root=(N+3)>>1;char s[10];  int x,y;for(int i=1;i<=M;i++){scanf("%s%d",s,&x);if(s[0]=='T')move(x,-inf);if(s[0]=='B')move(x,inf);if(s[0]=='I'){scanf(" "); char sai;scanf("%c",&sai);if(sai=='-')scanf("%d",&y),y=-y;else y=sai-'0';move(x,y);}if(s[0]=='A')splay(pos[x],root),printf("%d\n",size[c[pos[x]][0]]-1);if(s[0]=='Q')printf("%d\n",v[find(root,x+1)]);}}int main(){solve();return 0;}


0 0
原创粉丝点击