bzoj3223: Tyvj 1729 文艺平衡树
地址:http://www.lydsy.com/JudgeOnline/problem.php?id=3223
题目:
3223: Tyvj 1729 文艺平衡树
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 5292 Solved: 3123
[Submit][Status][Discuss]
Description
您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1
Input
第一行为n,m n表示初始序列有n个数,这个序列依次是(1,2……n-1,n) m表示翻转操作次数
接下来m行每行两个数[l,r] 数据保证 1<=l<=r<=n
Output
输出一行n个数字,表示原始序列经过m次变换后的结果
Sample Input
5 3
1 3
1 3
1 4
1 3
1 3
1 4
Sample Output
4 3 2 1 5
HINT
N,M<=100000
Source
思路:
复习splay
1 /************************************************************** 2 Problem: 3223 3 User: weeping 4 Language: C++ 5 Result: Accepted 6 Time:3032 ms 7 Memory:4032 kb 8 ****************************************************************/ 9 10 #include <bits/stdc++.h> 11 12 using namespace std; 13 14 #define lc ch[x][0] 15 #define rc ch[x][1] 16 17 struct SplayTree 18 { 19 20 const static int maxn = 1e5 + 15; 21 22 int tot,root,ch[maxn][2], key[maxn], val[maxn], sz[maxn], rev[maxn], fa[maxn]; 23 24 inline void init( int x, int ky, int v = 0, int par = 0 ) 25 { 26 lc=rc=0, fa[x]= par, key[x] = ky, val[x] = v, sz[x] = 1, rev[x] = 0; 27 } 28 29 inline void init() 30 { 31 init( 0, 0, 0 ); 32 sz[0] = 0; 33 tot = root = 0 ; 34 } 35 36 inline void push_up(int x) 37 { 38 sz[x] = sz[lc] + sz[rc] + 1; 39 } 40 41 inline void reverse(int x) 42 { 43 rev[x] ^= 1, swap( lc, rc); 44 } 45 46 inline void push_down(int x) 47 { 48 if(rev[x]) 49 { 50 if(lc) reverse(lc); 51 if(rc) reverse(rc); 52 rev[x] = 0; 53 } 54 } 55 56 void rotate( int x) 57 { 58 int f = fa[x], gf = fa[f]; 59 int t1 = (ch[f][1] == x), t2 = (ch[gf][1] == f); 60 if( gf ) ch[gf][t2] = x; 61 fa[x] = gf, ch[f][t1] = ch[x][1^t1], fa[ch[f][t1]] = f; 62 ch[x][t1^1] = f, fa[f] = x; 63 push_up( f ), push_up( x ); 64 } 65 66 void splay( int x, int tar ) 67 { 68 for(int f = fa[x], gf = fa[f]; f != tar; rotate(x), f = fa[x], gf = fa[f]) 69 if(gf != tar) 70 rotate( ((ch[f][1] == x) == (ch[gf][1] == f) )? f: x); 71 if( !tar ) root = x; 72 } 73 74 void insert( int ky, int v) 75 { 76 int x = root, ls = root; 77 while(x) 78 { 79 push_down(x); 80 sz[x] ++, ls = x; 81 x = ch[x][ky > key[x]]; 82 } 83 init( ++tot, ky, v, ls); 84 ch[ls][ky > key[ls]] = tot; 85 splay( tot, 0); 86 } 87 88 int find( int ky) 89 { 90 int x = root; 91 while(x) 92 { 93 push_down(x); 94 if(key[x] == ky) break; 95 x = ch[x][ky > key[x]]; 96 } 97 if(x) splay(x,0); 98 else x = -1; 99 return x; 100 } 101 102 // Delete Root 103 void Delete() 104 { 105 if( !ch[root][0] ) 106 { 107 fa[ ch[root][1] ] = 0 ; 108 root = ch[root][1]; 109 } 110 else 111 { 112 int cur = ch[root][0]; 113 while( ch[cur][1] ) cur = ch[cur][1]; 114 splay( cur, root ); 115 ch[cur][1] = ch[root][1]; 116 root = cur, fa[cur] = 0, fa[ch[root][1]] = root; 117 push_up( root ); 118 } 119 } 120 121 int kth( int k) 122 { 123 int x = root; 124 if(sz[x] < k) return -1; 125 while(x) 126 { 127 push_down(x); 128 if(k == sz[lc] + 1) break; 129 if(k > sz[lc]) 130 k -= sz[lc] + 1, x = rc; 131 else 132 x = lc; 133 } 134 if(x) splay(x,0); 135 else x = -1; 136 return x; 137 } 138 139 int pred( void) 140 { 141 int x = root; 142 if(!x || !lc) return -1; 143 while(lc) push_down(x), x = lc; 144 splay( x, 0); 145 return x; 146 } 147 148 int succ( void) 149 { 150 int x = root; 151 if(!x || !rc) return -1; 152 while(rc) push_down(x), x = rc; 153 splay( x, 0); 154 return x; 155 } 156 157 void debug( int x,int n) 158 { 159 if( !x ) return; 160 push_down(x); 161 if(lc) debug( lc, n); 162 if(val[x]<=n && val[x]>0) 163 printf("%d ", val[x] ); 164 if(rc) debug( rc, n); 165 } 166 167 void go(int l,int r,int n) 168 { 169 int y = kth(r + 2), x = kth(l); 170 splay( y, x); 171 //debug(root,n);puts(""); 172 reverse(ch[rc][0]); 173 //debug(root,n);puts(""); 174 } 175 } sp; 176 177 int main(void) 178 { 179 int n,m,l,r; 180 sp.init(); 181 scanf("%d%d",&n,&m); 182 for(int i=0;i<=n+1;i++) 183 sp.insert(i,i); 184 while(m--) 185 scanf("%d%d",&l,&r),sp.go(l,r,n); 186 sp.debug( sp.root, n); 187 return 0; 188 }
作者:weeping
出处:www.cnblogs.com/weeping/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。