[HZOI 2016][Tyvj 1729]文艺平衡树 这道题我真是哭了,调了一下午,一晚上
【题目描述】
您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1
【输入格式】
第一行为n,m n表示初始序列有n个数,这个序列依次是(1,2……n-1,n) m表示翻转操作次数
接下来m行每行两个数[l,r] 数据保证 1<=l<=r<=n
【输出格式】
输出一行n个数字,表示原始序列经过m次变换后的结果
【样例输入】
5 3 1 3 1 3 1 4
【样例输出】
4 3 2 1 5
【数据范围】
N,M<=100000
【来源】
Tyvj 1729
solution
板子题,但是从这个板子题里,我真是学会了很多东西
在调的很长时间里,我甚至思考过人生
体会了绝处逢生的感觉
有两个地方:
1.在kth和rot里都要pushdown
2.INF哨兵节点的父亲一定要=-INF的 (一开始) (就因为这个,我调了很长时间)
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #define ls(x) ((x)->ch[0]) 5 #define rs(x) ((x)->ch[1]) 6 #define sz(x) ((x)->size) 7 #define p(x) ((x)->p) 8 using namespace std; 9 const int INF=0x7fffffff; 10 struct son 11 { 12 int v,size,sw; 13 son *ch[2],*p; 14 son(int val,son *fa) 15 { 16 v=val;size=1;sw=0;p=fa; 17 } 18 }*root,*null; 19 int n,m; 20 void pushup(son *x){sz(x)=sz(ls(x))+sz(rs(x))+1;} 21 void swap(son *&a,son *&b){son *temp=a;a=b;b=temp;} 22 void change(son *x) 23 { 24 if(x==null)return ; 25 x->sw^=1; 26 //printf("1 %d %d\n",ls(x)->v,rs(x)->v); 27 swap(ls(x),rs(x)); 28 //printf("2 %d %d\n",ls(x)->v,rs(x)->v); 29 } 30 void pushdown(son *x) 31 { 32 if(!x->sw||x==null)return ; 33 change(ls(x));change(rs(x));x->sw=0; 34 } 35 int islc(son *x){return ls(p(x))==x;} 36 // is left child???? 37 38 void rot(son *y)//x:父亲 y:儿子 z:祖父 39 { 40 //printf("yrot=%d\n",y->v); 41 son *x=p(y);int d=islc(y); 42 pushdown(x);pushdown(y);//****** 43 if(p(x)==null)root=y; 44 else p(x)->ch[islc(x)^1]=y;//这个地方 warnnig 45 p(y)=p(x);// 46 x->ch[d^1]=y->ch[d]; 47 if(y->ch[d])p(y->ch[d])=x;// 48 y->ch[d]=x;p(x)=y;// 49 pushup(x);pushup(y); 50 } 51 52 /*void rot(son *x,int d)//x:父亲 y:儿子 z:祖父 53 { 54 son *y=x->ch[d^1]; 55 pushdown(x);pushdown(y);//****** 56 if(p(x)!=null)p(x)->ch[islc(x)^1]=y; 57 else root=y; 58 p(y)=p(x);// 59 x->ch[d^1]=y->ch[d]; 60 if(y->ch[d])p(y->ch[d])=x;// 61 y->ch[d]=x;p(x)=y;// 62 pushup(x);pushup(y); 63 }*/ 64 65 void bianli(son *x); 66 67 void splay(son *x,son *t)//x:儿子 y:父亲 68 { 69 //if(t==root)printf("YES\n"); 70 //printf("beginsplay %d\n",x->v); 71 while(p(x)!=t) 72 { 73 //printf("ci\n"); 74 son *y=p(x); 75 if(p(y)!=t) 76 { 77 if(islc(x)==islc(y))rot(y); 78 else rot(x); 79 } 80 //bianli(root); 81 //printf("x=%d y=%d\n",x->v,y->v); 82 //printf("p(x)->val=%d\n",p(x)->v); 83 //printf("p(p(x))=%d\n",p(p(x))->v); 84 rot(x); 85 //bianli(root); 86 //printf("\n"); 87 } 88 } 89 90 /*void splay(son *x,son *t)//x:儿子 y:父亲 91 { 92 if(t==root)printf("YES\n"); 93 //printf("beginsplay\n"); 94 while(p(x)!=t) 95 { 96 printf("ci\n"); 97 son *y=p(x); 98 if(p(y)!=t)islc(x)==islc(y)?rot(y):rot(x); 99 rot(x); 100 } 101 }*/ 102 son* kth(int k) 103 { 104 //printf("beginkth\n"); 105 son *x=root; 106 while(x!=null) 107 {//printf("endkth\n"); 108 //printf("k=%d\n",k); 109 pushdown(x);//****** 110 if(sz(ls(x))+1==k){return x;} 111 if(sz(ls(x))+1>k)x=ls(x); 112 else {k-=(sz(ls(x))+1);x=rs(x);} 113 } 114 } 115 116 117 void Splay(int l,int r) 118 { 119 //printf("l=%d r=%d\n",l,r); 120 son *zuo=kth(l); 121 122 //printf("zuo=%d\n",zuo->v); 123 splay(zuo,null); 124 //bianli(root); 125 //printf("2\n"); 126 son *you=kth(r+2); 127 //printf("you=%d\n",you->v); 128 splay(you,root); 129 //bianli(root); 130 //cout<<0; 131 change(root->ch[1]->ch[0]); 132 } 133 son* build(int l,int r,son *fa) 134 { 135 if(l>r)return null; 136 int mid=(l+r)>>1; 137 son *x=new son(mid,fa); 138 x->ch[0]=build(l,mid-1,x); 139 x->ch[1]=build(mid+1,r,x); 140 pushup(x); 141 return x; 142 } 143 144 void bianli(son *x) 145 { 146 if(x==null)return ; 147 pushdown(x); 148 //printf("%d ",x->size); 149 //printf("%d ",x->v); 150 bianli(ls(x)); 151 if(x->v!=INF&&x->v!=-INF) 152 printf("%d ",x->v); 153 bianli(rs(x)); 154 } 155 156 int main(){ 157 //freopen("sph.in","r",stdin); 158 //freopen("sph.out","w",stdout); 159 null=new son(0,0);null->size=0; 160 root=new son(-INF,null); 161 root->ch[1]=new son(INF,root);//son(INF,root) 我竟然写成了son(INF,null) 调了一下午 162 root->ch[0]=null; 163 scanf("%d%d",&n,&m); 164 //printf("n=%d m=%d\n",n,m); 165 root->ch[1]->ch[0]=build(1,n,root->ch[1]); 166 root->ch[1]->ch[1]=null; 167 pushup(root->ch[1]); 168 pushup(root); 169 170 //if(root==null) 171 // printf("what the fuck!!!\n"); 172 173 //bianli(root); 174 175 for(int i=1;i<=m;++i) 176 { 177 int qq,ww; 178 scanf("%d%d",&qq,&ww); 179 Splay(qq,ww); 180 //printf("bianli= "); 181 //bianli(root); 182 //printf("\n"); 183 //bianli(root); 184 } 185 //printf("\n"); 186 bianli(root); 187 //while(1); 188 return 0; 189 }
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #define ls(x) ((x)->ch[0]) 5 #define rs(x) ((x)->ch[1]) 6 #define sz(x) ((x)->size) 7 #define p(x) ((x)->p) 8 using namespace std; 9 const int INF=0x7fffffff; 10 struct son 11 { 12 int v,size,sw; 13 son *ch[2],*p; 14 son(int val,son *fa) 15 { 16 v=val;size=1;sw=0;p=fa; 17 } 18 }*root,*null; 19 int n,m; 20 void pushup(son *x){sz(x)=sz(ls(x))+sz(rs(x))+1;} 21 void swap(son *&a,son *&b){son *temp=a;a=b;b=temp;} 22 void change(son *x) 23 { 24 if(x==null)return ; 25 x->sw^=1; 26 swap(ls(x),rs(x)); 27 } 28 void pushdown(son *x) 29 { 30 if(!x->sw||x==null)return ; 31 change(ls(x));change(rs(x));x->sw=0; 32 } 33 int islc(son *x){return ls(p(x))==x;} 34 // is left child???? 35 36 void rot(son *y)//x:父亲 y:儿子 z:祖父 37 { 38 son *x=p(y);int d=islc(y); 39 pushdown(x);pushdown(y);//****** 40 if(p(x)==null)root=y; 41 else p(x)->ch[islc(x)^1]=y;//这个地方 warnnig 42 p(y)=p(x);// 43 x->ch[d^1]=y->ch[d]; 44 if(y->ch[d])p(y->ch[d])=x;// 45 y->ch[d]=x;p(x)=y;// 46 pushup(x);pushup(y); 47 } 48 void bianli(son *x); 49 50 void splay(son *x,son *t)//x:儿子 y:父亲 51 { 52 while(p(x)!=t) 53 { 54 son *y=p(x); 55 if(p(y)!=t)islc(x)==islc(y)?rot(y):rot(x); 56 rot(x); 57 } 58 } 59 son* kth(int k) 60 { 61 son *x=root; 62 while(x!=null) 63 { 64 pushdown(x);//****** 65 if(sz(ls(x))+1==k){return x;} 66 if(sz(ls(x))+1>k)x=ls(x); 67 else {k-=(sz(ls(x))+1);x=rs(x);} 68 } 69 } 70 void Splay(int l,int r) 71 { 72 splay(kth(l),null); 73 splay(kth(r+2),root); 74 change(root->ch[1]->ch[0]); 75 } 76 son* build(int l,int r,son *fa) 77 { 78 if(l>r)return null; 79 int mid=(l+r)>>1; 80 son *x=new son(mid,fa); 81 x->ch[0]=build(l,mid-1,x); 82 x->ch[1]=build(mid+1,r,x); 83 pushup(x); 84 return x; 85 } 86 87 void bianli(son *x) 88 { 89 if(x==null)return ; 90 pushdown(x); 91 bianli(ls(x)); 92 if(x->v!=INF&&x->v!=-INF) 93 printf("%d ",x->v); 94 bianli(rs(x)); 95 } 96 97 int main(){ 98 //freopen("sph.in","r",stdin); 99 //freopen("sph.out","w",stdout); 100 null=new son(0,0);null->size=0; 101 root=new son(-INF,null); 102 root->ch[1]=new son(INF,root);//son(INF,root) 我竟然写成了son(INF,null) 调了一下午 103 root->ch[0]=null; 104 scanf("%d%d",&n,&m); 105 root->ch[1]->ch[0]=build(1,n,root->ch[1]); 106 root->ch[1]->ch[1]=null; 107 pushup(root->ch[1]); 108 pushup(root); 109 for(int i=1;i<=m;++i) 110 { 111 int qq,ww; 112 scanf("%d%d",&qq,&ww); 113 Splay(qq,ww); 114 } 115 bianli(root); 116 //while(1); 117 return 0; 118 }