标签:style blog io color sp for div on log
题意:m条操作指令,对于指令 a b 表示取出第a~b个元素,翻转后添加到排列的尾部。
水题卡了一个小时,一直过不了样例。 原来是 dfs输出的时候 忘记向下传递标记了。
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 const double eps = 1e-8; 7 const int maxn = 100086; 8 int siz[maxn],pre[maxn],ch[maxn][2],rev[maxn],key[maxn]; 9 int n,m,tot,root; 10 void update_rev(int r) 11 { 12 if (!r) 13 return; 14 swap(ch[r][0],ch[r][1]); 15 rev[r] ^= 1; 16 } 17 void push_up(int r) 18 { 19 siz[r] = siz[ch[r][0]] + siz[ch[r][1]] + 1; 20 } 21 void push_down(int r) 22 { 23 if (rev[r]) 24 { 25 update_rev(ch[r][0]); 26 update_rev(ch[r][1]); 27 rev[r] = 0; 28 } 29 } 30 void NewNode(int &r,int father,int k) 31 { 32 r = ++tot; 33 pre[r] = father; 34 ch[r][0] = ch[r][1] = 0; 35 key[r] = k; 36 rev[r] = 0; 37 siz[r] = 1; 38 } 39 void build(int &x,int l,int r,int father) 40 { 41 if (l > r) 42 return; 43 int mid = (l + r) >> 1; 44 NewNode(x,father,mid); 45 build(ch[x][0],l,mid-1,x); 46 build(ch[x][1],mid+1,r,x); 47 push_up(x); 48 } 49 void init() 50 { 51 root = tot = 0; 52 NewNode(root,0,-1); 53 NewNode(ch[root][1],root,-1); 54 build(ch[ch[root][1]][0],1,n,ch[root][1]); 55 push_up(root); 56 push_up(ch[root][1]); 57 } 58 void Rotate(int x,int kind) 59 { 60 int y = pre[x]; 61 push_down(y); 62 push_down(x); 63 ch[y][!kind] = ch[x][kind]; 64 pre[ch[x][kind]] = y; 65 if (pre[y]) 66 ch[pre[y]][ch[pre[y]][1] == y] = x; 67 pre[x] = pre[y]; 68 ch[x][kind] = y; 69 pre[y] = x; 70 push_up(y); 71 } 72 void Splay(int r,int goal) 73 { 74 push_down(r); 75 while (pre[r] != goal) 76 { 77 if (pre[pre[r]] == goal) 78 { 79 push_down(pre[r]); 80 push_down(r); 81 Rotate(r,ch[pre[r]][0] == r); 82 } 83 else 84 { 85 int y = pre[r]; 86 int kind = (ch[pre[y]][1] == y); 87 push_down(pre[y]); 88 push_down(y); 89 push_down(r); 90 if (ch[y][kind] == r) 91 { 92 Rotate(y,!kind); 93 Rotate(r,!kind); 94 } 95 else 96 { 97 Rotate(r,kind); 98 Rotate(r,!kind); 99 } 100 } 101 } 102 push_up(r); 103 if (goal == 0) 104 root = r; 105 } 106 int Get_kth(int r,int k) 107 { 108 push_down(r); 109 int t = siz[ch[r][0]] + 1; 110 if (k == t) 111 return r; 112 if (k >= t) 113 return Get_kth(ch[r][1],k-t); 114 else 115 return Get_kth(ch[r][0],k); 116 } 117 void Reverse(int u,int v) 118 { 119 Splay(Get_kth(root,u),0); 120 Splay(Get_kth(root,v+2),root); 121 update_rev(ch[ch[root][1]][0]); 122 push_up(ch[root][1]); 123 push_up(root); 124 } 125 void dfs(int r) 126 { 127 if (!r) 128 return; 129 push_down(r); 130 dfs(ch[r][0]); 131 if (r != -1 && key[r] != -1) //-1设置的虚节点 132 printf("%d\n",key[r]); 133 dfs(ch[r][1]); 134 } 135 int main(void) 136 { 137 #ifndef ONLINE_JUDGE 138 freopen("in.txt","r",stdin); 139 #endif 140 while (~scanf ("%d%d",&n,&m)) 141 { 142 init(); 143 for (int i = 0; i < m; i++) 144 { 145 int u,v; 146 scanf ("%d%d",&u,&v); 147 Reverse(u,n); 148 Reverse(u,u+n-v-1); 149 } 150 dfs(root); 151 } 152 return 0; 153 }
UVA11922--Permutation Transformer (伸展树Splay)
标签:style blog io color sp for div on log
原文地址:http://www.cnblogs.com/oneshot/p/4081566.html