原题链接:http://ac.jobdu.com/problem.php?pid=1541
简答题如下:
1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cstdio> 6 const int Max_N = 1100; 7 struct Node{ 8 int v, s; 9 Node *pre, *ch[2]; 10 inline void set(int _v = 0, int _s = 0, Node *p = NULL){ 11 v = _v, s = _s; 12 pre = ch[0] = ch[1] = p; 13 } 14 inline void push_up(){ 15 s = ch[0]->s + ch[1]->s + 1; 16 } 17 inline void link(Node *x, bool d){ 18 ch[d] = x; 19 x->pre = this; 20 } 21 }; 22 struct SplayTree{ 23 Node *tail, *root, *null; 24 Node stack[Max_N], *ptr[Max_N]; 25 void init(){ 26 tail = &stack[0]; 27 null = tail++; 28 null->set(); 29 root = null; 30 } 31 inline Node *newNode(int v){ 32 Node *p = tail++; 33 p->set(v, 1, null); 34 return p; 35 } 36 inline void rotate(Node *x, int d){ 37 Node *y = x->pre; 38 y->ch[!d] = x->ch[d]; 39 if (x->ch[d] != null) x->ch[d]->pre = y; 40 x->pre = y->pre; 41 if (y->pre != null) y->pre->ch[y->pre->ch[0] != y] = x; 42 x->ch[d] = y; 43 y->pre = x; 44 y->push_up(), x->push_up(); 45 if (y == root) root = x; 46 } 47 inline void update(Node *x){ 48 if (x != null){ 49 update(x->ch[0]); 50 update(x->ch[1]); 51 x->push_up(); 52 } 53 } 54 void gogo(int n){ 55 int i, a, b; 56 for (i = 0; i <= n; i++) ptr[i] = newNode(i); 57 for (i = 1; i <= n; i++){ 58 scanf("%d %d", &a, &b); 59 if (-1 == a || -1 == b){ 60 if (-1 == a && b != -1) ptr[i]->link(ptr[b], 1); 61 if (-1 == b && a != -1) ptr[i]->link(ptr[a], 0); 62 } else { 63 ptr[i]->link(ptr[a], 0); 64 ptr[i]->link(ptr[b], 1); 65 } 66 ptr[i]->push_up(); 67 if (ptr[i]->pre == null) root = ptr[i]; 68 } 69 update(root); 70 } 71 inline void work(){ 72 int i, t; 73 char buf[50]; 74 scanf("%d", &t); 75 while (t--){ 76 scanf("%s %d", buf, &i); 77 if ('s' == buf[0]){ 78 printf("%d ", ptr[i]->s); 79 } else if ('r' == buf[0]){ 80 if (ptr[i] == root) continue; 81 rotate(ptr[i], ptr[i]->pre->ch[0] == ptr[i]); 82 } else { 83 if (ptr[i] == root) printf("-1 "); 84 else printf("%d ", ptr[i]->pre->v); 85 } 86 } 87 } 88 }spt; 89 int main(){ 90 #ifdef LOCAL 91 freopen("in.txt", "r", stdin); 92 freopen("out.txt", "w+", stdout); 93 #endif 94 int n; 95 while (~scanf("%d", &n)){ 96 spt.init(), spt.gogo(n), spt.work(); 97 } 98 return 0; 99 }