标签:
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1890
如下:
1 #include<cstdio> 2 #include<cstdlib> 3 #include<iostream> 4 #include<algorithm> 5 using std::sort; 6 using std::swap; 7 const int Max_N = 100010; 8 struct node{ 9 int val, pos; 10 }rec[100001]; 11 inline bool cmp(const node &a, const node &b){ 12 if (a.val == b.val) return a.pos < b.pos; 13 return a.val < b.val; 14 } 15 struct Node{ 16 int v, s, rsz, rev; 17 Node *pre, *ch[2]; 18 inline void set(int _v = -1, int _s = 0, Node *p = NULL){ 19 v = _v, s = _s, rev = rsz = 0; 20 pre = ch[0] = ch[1] = p; 21 } 22 inline void update(){ 23 rev ^= 1; 24 swap(ch[0], ch[1]); 25 } 26 inline void push_up(){ 27 s = ch[0]->s + ch[1]->s + 1; 28 rsz = ch[0]->rsz + ch[1]->rsz; 29 if (v != -1) rsz++; 30 } 31 inline void push_down(){ 32 if (rev != 0){ 33 rev ^= 1; 34 ch[0]->update(); 35 ch[1]->update(); 36 } 37 } 38 }; 39 struct SplayTree{ 40 int top = 0; 41 Node *tail, *root, *null; 42 Node stack[Max_N], *store[Max_N], *ptr[Max_N]; 43 void init(int n){ 44 top = 0; 45 tail = &stack[0]; 46 null = tail++; 47 null->set(); 48 root = newNode(-1); 49 root->ch[1] = newNode(-1); 50 root->ch[1]->pre = root; 51 Node *x = built(1, n); 52 root->ch[1]->ch[0] = x; 53 x->pre = root->ch[1]; 54 root->ch[1]->push_up(); 55 root->push_up(); 56 } 57 inline Node *built(int l, int r){ 58 Node *p = null; 59 if (l > r) return null; 60 int mid = (l + r) >> 1; 61 p = newNode(rec[mid].val), ptr[mid] = p; 62 p->ch[0] = built(l, mid - 1); 63 if (p->ch[0] != null) p->ch[0]->pre = p; 64 p->ch[1] = built(mid + 1, r); 65 if (p->ch[1] != null) p->ch[1]->pre = p; 66 p->push_up(); 67 return p; 68 } 69 inline Node *newNode(int v){ 70 Node *p = null; 71 if (!top) p = tail++; 72 else p = store[--top]; 73 p->set(v, 1, null); 74 return p; 75 } 76 inline void rotate(Node *x, int d){ 77 Node *y = x->pre; 78 y->push_down(), x->push_down(); 79 y->ch[!d] = x->ch[d]; 80 if (x->ch[d] != null) x->ch[d]->pre = y; 81 x->pre = y->pre; 82 if (y->pre != null) y->pre->ch[y->pre->ch[0] != y] = x; 83 x->ch[d] = y; 84 y->pre = x; 85 y->push_up(); 86 if (y == root) root = x; 87 } 88 inline void splay(Node *x, Node *f){ 89 for (; x->pre != f; x->push_down()){ 90 if (x->pre->pre == f){ 91 rotate(x, x->pre->ch[0] == x); 92 } else { 93 Node *y = x->pre, *z = y->pre; 94 if (z->ch[0] == y){ 95 if (y->ch[0] == x) rotate(y, 1), rotate(x, 1); 96 else rotate(x, 0), rotate(x, 1); 97 } else { 98 if (y->ch[1] == x) rotate(y, 0), rotate(x, 0); 99 else rotate(x, 1), rotate(x, 0); 100 } 101 } 102 } 103 x->push_up(); 104 } 105 inline Node *select(Node *x, int k){ 106 int t = 0; 107 for (;;){ 108 x->push_down(); 109 t = x->ch[0]->s; 110 if (k == t + 1) break; 111 else if (k < t + 1) x = x->ch[0]; 112 else k -= t + 1, x = x->ch[1]; 113 } 114 return x; 115 } 116 inline void del(){ 117 Node *x = root; 118 store[top++] = x; 119 root = root->ch[1]; 120 root->pre = null; 121 splay(select(root, 1), null); 122 root->ch[0] = x->ch[0]; 123 root->ch[0]->pre = root; 124 root->push_up(); 125 } 126 inline void solve(int n) { 127 const int N = n + 2; 128 for (int i = 1; i <= n; ++i) { 129 scanf("%d", &rec[i].val); 130 rec[i].pos = i; 131 } 132 init(n), sort(rec + 1, rec + n + 1, cmp); 133 splay(root->ch[1], null); 134 for (int i = 1; i <= n; i++){ 135 splay(ptr[rec[i].pos], null); 136 root->ch[0]->update(); 137 printf("%d", root->ch[0]->rsz + i); 138 if (i != n) printf(" "); 139 del(); 140 } 141 printf("\n"); 142 } 143 }spt; 144 int main(){ 145 #ifdef LOCAL 146 freopen("in.txt", "r", stdin); 147 freopen("out.txt", "w+", stdout); 148 #endif 149 int n; 150 while (~scanf("%d", &n) && n) { 151 spt.solve(n); 152 } 153 return 0; 154 }
标签:
原文地址:http://www.cnblogs.com/GadyPu/p/4472269.html