首页 > 代码库 > UVA11922--Permutation Transformer (伸展树Splay)
UVA11922--Permutation Transformer (伸展树Splay)
题意: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 else115 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_JUDGE138 freopen("in.txt","r",stdin);139 #endif140 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)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。