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
- BZOJ 1861 书架(splay)
- BZOJ-1861 Book 书架 Splay
- BZOJ 1861 ZJOI2006 Book 书架 Splay
- BZOJ 1861 ZJOI 2006 Book 书架 Splay
- 【BZOJ 1861】[Zjoi2006]Book 书架 splay
- splay伸展树基础操作(bzoj 1861: [Zjoi2006]Book 书架)
- splay学习小结1.1【BZOJ 1861】[Zjoi2006]Book 书架
- 【BZOJ1861】书架(Splay)
- luoguP2596 [ZJOI2006]书架(splay)
- [BZOJ1861][ZJOI2006]书架(平衡树splay)
- BZOJ 1861 Book 书架 第一份完全凭自己理解手敲的Splay树啊。记念一下
- BZOJ 1861: [Zjoi2006]Book 书架
- 【BZOJ 1861】 [Zjoi2006]Book 书架
- bzoj 1861: [Zjoi2006]Book 书架
- BZOJ 1861 [Zjoi2006] Book 书架
- BZOJ 1861 [Zjoi2006]Book 书架
- bzoj 1861 [Zjoi2006]Book 书架
- bzoj1861 book书架 splay
- linux系统备份命令
- 套接字工厂——ServerSocketFactory
- 【USACO2.3.1】最长前缀 KMP(爆内存) 暴力(居然更快还AC)
- 【C/C++】int *p[4]与int (*q)[4]的区别
- java.ByteArrayInputStream与ByteArrayOutputStream浅谈
- BZOJ 1861 书架(splay)
- OC_类
- 【C/C++】C/C++ 中二维数组传递的三种方式
- 分红酒
- html常用标签及说明
- BufferedOutputStream和ByteArrayOutputStream区别
- OC_ 常见错误
- float f = new Float(2);
- POJ 1780 Code (欧拉回路+非递归版dfs)