BZOJ 1861 [Zjoi2006]Book 书架
2017-04-10 21:41
405 查看
Description
小T有一个很大的书柜。这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列。她用1到n的正整数给每本书都编了号。 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本。由于这些书太有吸引力了,所以她看完后常常会忘记原来是放在书柜的什么位置。不过小T的记忆力是非常好的,所以每次放书的时候至少能够将那本书放在拿出来时的位置附近,比如说她拿的时候这本书上面有X本书,那么放回去时这本书上面就只可能有X-1、X或X+1本书。当然也有特殊情况,比如在看书的时候突然电话响了或者有朋友来访。这时候粗心的小T会随手把书放在书柜里所有书的最上面或者最下面,然后转身离开。 久而久之,小T的书柜里的书的顺序就会越来越乱,找到特定的编号的书就变得越来越困难。于是她想请你帮她编写一个图书管理程序,处理她看书时的一些操作,以及回答她的两个提问
4000
:(1)编号为X的书在书柜的什么位置;(2)从上到下第i本书的编号是多少。
Input
第一行有两个数n,m,分别表示书的个数以及命令的条数;第二行为n个正整数:第i个数表示初始时从上至下第i个位置放置的书的编号;第三行到m+2行,每行一条命令。命令有5种形式: 1. Top S——表示把编号为S的书房在最上面。 2. Bottom S——表示把编号为S的书房在最下面。 3. Insert S T——T∈{-1,0,1},若编号为S的书上面有X本书,则这条命令表示把这本书放回去后它的上面有X+T本书;4. Ask S——询问编号为S的书的上面目前有多少本书。 5. Query S——询问从上面数起的第S本书的编号。
Output
对于每一条Ask或Query语句你应该输出一行,一个数,代表询问的答案。Sample Input
10 101 3 2 7 5 8 10 4 9 6
Query 3
Top 5
Ask 6
Bottom 3
Ask 3
Top 6
Insert 4 -1
Query 5
Query 2
Ask 2
Sample Output
29
9
7
5
3
HINT
数据范围100%的数据,n,m < = 80000
Source
Description
小T有一个很大的书柜。这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列。她用1到n的正整数给每本书都编了号。 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本。由于这些书太有吸引力了,所以她看完后常常会忘记原来是放在书柜的什么位置。不过小T的记忆力是非常好的,所以每次放书的时候至少能够将那本书放在拿出来时的位置附近,比如说她拿的时候这本书上面有X本书,那么放回去时这本书上面就只可能有X-1、X或X+1本书。当然也有特殊情况,比如在看书的时候突然电话响了或者有朋友来访。这时候粗心的小T会随手把书放在书柜里所有书的最上面或者最下面,然后转身离开。 久而久之,小T的书柜里的书的顺序就会越来越乱,找到特定的编号的书就变得越来越困难。于是她想请你帮她编写一个图书管理程序,处理她看书时的一些操作,以及回答她的两个提问:(1)编号为X的书在书柜的什么位置;(2)从上到下第i本书的编号是多少。
Input
第一行有两个数n,m,分别表示书的个数以及命令的条数;第二行为n个正整数:第i个数表示初始时从上至下第i个位置放置的书的编号;第三行到m+2行,每行一条命令。命令有5种形式: 1. Top S——表示把编号为S的书房在最上面。 2. Bottom S——表示把编号为S的书房在最下面。 3. Insert S T——T∈{-1,0,1},若编号为S的书上面有X本书,则这条命令表示把这本书放回去后它的上面有X+T本书;4. Ask S——询问编号为S的书的上面目前有多少本书。 5. Query S——询问从上面数起的第S本书的编号。
Output
对于每一条Ask或Query语句你应该输出一行,一个数,代表询问的答案。Sample Input
10 101 3 2 7 5 8 10 4 9 6
Query 3
Top 5
Ask 6
Bottom 3
Ask 3
Top 6
Insert 4 -1
Query 5
Query 2
Ask 2
Sample Output
29
9
7
5
3
HINT
数据范围100%的数据,n,m < = 80000
Source
一开始看到这题都蒙逼了,不符合套路啊。后来借鉴了一下hzwer,原来编号是一定的只要建树的时候建一个pos数组,表示编号为i的书再splay中的编号,他就是一道裸题了。
#include<iostream> #include<cstdio> using namespace std; const int N=200005; const int inf=1e9+7; int n,m,rt,cnt,a ,val ,ch [2],fa ,sz ,pos ; void pushup(int x) { sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+1; } void rotate(int x,int &k) { int y=fa[x],z=fa[y],lc=ch[y][1]==x,rc=lc^1; if(k==y) k=x; else ch[z][ch[z][1]==y]=x; fa[y]=x,fa[x]=z,fa[ch[x][rc]]=y; ch[y][lc]=ch[x][rc],ch[x][rc]=y; pushup(y),pushup(x); } void splay(int x,int &k) { while(x!=k) { int y=fa[x],z=fa[y]; if(y!=k) { if((ch[z][0]==y)^(ch[y][0]==x)) rotate(x,k); else rotate(y,k); } rotate(x,k); } } int build(int l,int r,int f) { if(l>r) return 0; int mid=(l+r)/2,x=++cnt; val[x]=a[mid]; pos[val[x]]=x; fa[x]=f; ch[x][0]=build(l,mid-1,x); ch[x][1]=build(mid+1,r,x); pushup(x); return x; } void split(int x,int y) { splay(x,rt),splay(y,ch[rt][1]); } int fnd(int x,int rnk) { if(rnk<=sz[ch[x][0]]) return fnd(ch[x][0],rnk); if(rnk>sz[ch[x][0]]+1) return fnd(ch[x][1],rnk-sz[ch[x][0]]-1); return x; } void del(int rnk) { int x=fnd(rt,rnk-1),y=fnd(rt,rnk+1); split(x,y); fa[ch[y][0]]=0,ch[y][0]=0; pushup(y),pushup(x); } void move(int x,int y) { int z=pos[x]; splay(z,rt); int rnk=sz[ch[z][0]]+1,p,q; del(rnk); if(y==-inf) p=fnd(rt,1),q=fnd(rt,2); else if(y==inf) p=fnd(rt,n),q=fnd(rt,n+1); else p=fnd(rt,rnk+y-1),q=fnd(rt,rnk+y); split(p,q); ch[q][0]=z; fa[z]=q; pushup(q),pushup(p); } int main() { scanf("%d%d",&n,&m); for(int i=2;i<=n+1;i++) scanf("%d",&a[i]); rt=build(1,n+2,0); char s[11]; int x,y; while(m--) { scanf("%s%d",s,&x); if(s[0]=='T') move(x,-inf); if(s[0]=='B') move(x,inf); if(s[0]=='I') { scanf("%d",&y); move(x,y); } if(s[0]=='A') { splay(pos[x],rt); printf("%d\n",sz[ch[pos[x]][0]]-1); } if(s[0]=='Q') printf("%d\n",val[fnd(rt,x+1)]); } return 0; }
相关文章推荐
- BZOJ1861: [Zjoi2006]Book 书架 Splay
- BZOJ_1861_[Zjoi2006]Book 书架_splay
- BZOJ1861: [Zjoi2006]Book 书架
- [bzoj1861][Zjoi2006]Book 书架_非旋转Treap
- bzoj 1861 [Zjoi2006]Book 书架
- bzoj 1861 [Zjoi2006]Book 书架
- BZOJ 1861 ZJOI 2006 Book 书架 Splay
- 【bzoj1861】[Zjoi2006]Book 书架 splay
- bzoj 1861: [Zjoi2006]Book 书架
- BZOJ1861 [Zjoi2006]Book 书架
- [BZOJ1861][Zjoi2006]Book 书架
- BZOJ 1861: [Zjoi2006]Book 书架
- 【权值分块】bzoj1861 [Zjoi2006]Book 书架
- BZOJ 1861: [Zjoi2006]Book 书架( splay )
- bzoj 1861: [Zjoi2006]Book 书架
- [BZOJ1861][Zjoi2006]Book 书架 && splay
- splay伸展树基础操作(bzoj 1861: [Zjoi2006]Book 书架)
- BZOJ1861 [Zjoi2006]Book 书架
- [BZOJ1861][Zjoi2006]Book 书架(平衡树)
- BZOJ1861: [Zjoi2006]Book 书架