bzoj1861: [Zjoi2006]Book 书架
2017-03-10 16:12
447 查看
1861: [Zjoi2006]Book 书架
Time Limit: 4 Sec Memory Limit: 64 MBDescription
小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
题解
明明是个轻松愉快的模板题,结果还是写了一个多小时哇。还是功力不够哇233。
#include<cstdio> #include<iostream> #include<algorithm> #define nd(x) (nil + (x)) using namespace std; const int N = 80000 + 10, M = 80000 + 10, inf = 0x7fffffff; struct Node{ int a, siz; Node *c[2], *f; int d() { return f->c[1] == this; } void sc(Node *x, int d) { (c[d] = x) -> f = this; } void pup() { siz = c[0]->siz + c[1]->siz + 1; } }nil , *root; int n, m, id , pos ; void rotate(Node *x, Node *&k){ int d = x->d(); Node *p = x->f; p->sc(x->c[!d], d); if(p == k){ x->f = k->f; k = x; } else p->f->sc(x, p->d()); x->sc(p, !d); p->pup(); x->pup(); } void splay(Node *x, Node *&k){ for(Node *y; x != k;){ y = x->f; if(y != k) (x->d() ^ y->d()) ? rotate(x, k) : rotate(y, k); rotate(x, k); } x->pup(); } Node* select(int k){ Node *p = root; while(true){ int t = p->c[0]->siz; if(t >= k) p = p->c[0]; else if(k > t + 1) p = p->c[1], k -= t + 1; else break; } return p; } void del(int k){ Node *x = select(k-1), *y = select(k+1); splay(x, root); splay(y, x->c[1]); Node *z = y->c[0]; y->c[0] = nil; z->f = nil; z->siz = 1; y->pup(); x->pup(); } inline void in(int &x); Node *build(int l, int r, Node *fa){ if(l > r) return nil; if(l == r){ Node *u = nd(l); u->a = id[l]; u->siz = 1; u->f = fa; u->c[0] = u->c[1] = nil; return u; } int mid = (l + r) >> 1; Node *u = nd(mid); u->c[0] = build(l, mid-1, u); u->c[1] = build(mid+1, r, u); u->a = id[mid]; u->f = fa; u->pup(); return u; } void outit(Node *p){ if(p == nil) return; printf("%d %d %d %d\n", p->a, p->c[0]->a, p->c[1]->a, p->siz); outit(p->c[0]); outit(p->c[1]); } void init(){ scanf("%d%d", &n, &m); for(int i = 2; i <= n + 1; i++) in(id[i]), pos[id[i]] = i; nil->c[0] = nil->c[1] = nil->f = nil; root = build(1, n+2, nil); } void move(int k, int val){ Node *z = nd(pos[k]); splay(z, root); int rk = z->c[0]->siz + 1; del(rk); Node *x, *y; if(val == inf) x = select(n), y = select(n + 1); else if(val == -inf) x = select(1), y = select(2); else x = select(rk + val - 1), y = select(rk + val); splay(x, root); splay(y, x->c[1]); z->f = y; y->c[0] = z; y->pup(); x->pup(); } void work(){ char ch[10]; int S, T; Node *u; while(m--){ scanf("%s", ch); in(S); switch(ch[0]){ case 'T': move(S, -inf); break; case 'B': move(S, inf); break; case 'I': in(T); move(S, T); break; case 'A': u = nd(pos[S]); splay(u, root); printf("%d\n", u->c[0]->siz - 1); break; case 'Q': u = select(S + 1); printf("%d\n", u->a); break; } } } int main(){ init(); work(); return 0; } inline void in(int &x){ x = 0; char c = getchar(); int f = 1; while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar(); } while(c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar(); } x *= f; }
相关文章推荐
- bzoj1861: [Zjoi2006]Book 书架
- bzoj1861 [Zjoi2006]Book 书架
- bzoj1861: [Zjoi2006]Book 书架 平衡树 Splay
- [bzoj1861][Zjoi2006]Book 书架_非旋转Treap
- 【BZOJ 1861】 [Zjoi2006]Book 书架
- splay学习小结1.1【BZOJ 1861】[Zjoi2006]Book 书架
- [bzoj1861][Zjoi2006]Book书架 splay
- bzoj 1861: [Zjoi2006]Book 书架
- [BZOJ1861][Zjoi2006]Book 书架(平衡树)
- BZOJ 1861: [Zjoi2006]Book 书架
- BZOJ 1861 [Zjoi2006]Book 书架
- BZOJ_1861_[Zjoi2006]Book 书架_splay
- BZOJ 1861: [Zjoi2006]Book 书架
- BZOJ 1861 [Zjoi2006] Book 书架
- 【bzoj1861】[Zjoi2006]Book 书架 splay
- BZOJ 1861: [Zjoi2006]Book 书架 splay
- BZOJ1861: [Zjoi2006]Book 书架 Splay
- bzoj 1861 [Zjoi2006]Book 书架
- [BZOJ1861][Zjoi2006]Book 书架 && splay
- BZOJ 1861: [Zjoi2006]Book 书架