第一行为n,m n表示初始序列有n个数,这个序列依次是(1,2……n-1,n) m表示翻转操作次数
接下来m行每行两个数[l,r] 数据保证 1<=l<=r<=n
第一行为n,m n表示初始序列有n个数,这个序列依次是(1,2……n-1,n) m表示翻转操作次数
接下来m行每行两个数[l,r] 数据保证 1<=l<=r<=n
输出一行n个数字,表示原始序列经过m次变换后的结果
N,M<=100000
同样是非旋treap
与splay做这道题的思路一样,交换左右子节点
1 if (x->r) x->size+=x->r->size; 2 } 3 Treap* rever(Treap* x) 4 { 5 if (!x) return 0; 6 swap(x->l,x->r); 7 x->rev^=1; 8 return x; 9 } 10 void pushdown(Treap* x) 11 { 12 if (x->rev) 13 { 14 rever(x->l); 15 rever(x->r); 16 x->rev=0; 17 } 18 } 19 Treap *merge(Treap *A,Treap *B) 20 { 21 if (!A) return B; 22 if (!B) return A; 23 if (A->lev<B->lev) 24 { 25 pushdown(A); 26 A->r=merge(A->r,B); 27 updata(A); 28 return A; 29 } 30 else 31 { 32 pushdown(B); 33 B->l=merge(A,B->l); 34 updata(B); 35 return B; 36 } 37 } 38 Droot split(Treap *x,int k) 39 { 40 if (!x) return Droot(0,0); 41 Droot y; 42 pushdown(x); 43 if (getsize(x->l)>=k) 44 { 45 y=split(x->l,k); 46 x->l=y.second; 47 updata(x); 48 y.second=x; 49 } 50 else 51 { 52 y=split(x->r,k-getsize(x->l)-1); 53 x->r=y.first; 54 updata(x); 55 y.first=x; 56 } 57 return y; 58 } 59 void reverse(int l,int r) 60 { 61 Droot x=split(root,l-1); 62 Droot y=split(x.second,r-l+1); 63 root=merge(merge(x.first,rever(y.first)),y.second); 64 } 65 int main() 66 {int opt,x,q,i,l,r; 67 cin>>n>>q; 68 Treap* rt; 69 for (i=1;i<=n;i++) 70 NewNode(rt,i),root=merge(root,rt); 71 while (q--) 72 { 73 scanf("%d%d",&l,&r); 74 reverse(l,r); 75 } 76 for (i=1;i<=n;i++) 77 { 78 Droot y=split(root,1); 79 printf("%d ",y.first->val); 80 root=y.second; 81 } 82 }
标签:sam wap color upd root desc code out section
原文地址:http://www.cnblogs.com/Y-E-T-I/p/7631541.html