BZOJ 1500 [NOI2005]维修数列 (splay)
题目大意:略
调了好久终于过了!
我犯了一个错误,虽然我记得在翻转pushdown的时候交换lx和rx
但我应该翻转的是左儿子和右儿子的lx和rx!而不是当前节点的lx和rx
因为pushup的时候是根据左右儿子的lx和rx更新的!
还有就是在find的时候下传标记,在转到根的时候pushup
很丧病的题
然后我的代码在洛谷上过了,可bzoj上迷之CE了,害得我的提交记录里多了13%的CE
1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4 #define root d[0].ch[1] 5 #define il inline 6 #define nu 7777 7 #define inf 500000 8 #define N 601000 9 using namespace std; 10 11 int n,m,hd,tl,tot; 12 char qq[20]; 13 int ww[N],que[N*10]; 14 struct SPLAY{ 15 int fa,ch[2],sz,val,sum,lx,rx,tx,tag,rev; 16 }d[N]; 17 il int idf(int x){return d[d[x].fa].ch[0]==x?0:1;} 18 il void con(int x,int ff,int p){d[x].fa=ff,d[ff].ch[p]=x;} 19 il int cre(int val) 20 { 21 int x=(hd>=tl)?que[tl++]:++tot; 22 d[x].lx=d[x].rx=d[x].tx=d[x].val=d[x].sum=val; 23 d[x].tag=nu,d[x].sz=1;return x; 24 } 25 il void des(int x) 26 { 27 memset(&d[x],0,sizeof(d[x])); 28 que[++hd]=x; 29 } 30 il void pushup(int x) 31 { 32 #define ls d[x].ch[0] 33 #define rs d[x].ch[1] 34 d[x].sz=d[ls].sz+d[rs].sz+1; 35 d[x].sum=d[ls].sum+d[rs].sum+d[x].val; 36 if(ls&&rs) 37 { 38 d[x].lx=max(d[ls].lx,d[ls].sum+max(0,d[x].val+max(0,d[rs].lx))); 39 d[x].rx=max(d[rs].rx,d[rs].sum+max(0,d[x].val+max(0,d[ls].rx))); 40 d[x].tx=max(d[ls].tx,d[rs].tx); 41 d[x].tx=max(d[x].tx,max(0,d[ls].rx)+d[x].val+max(0,d[rs].lx)); 42 d[x].tx=max(d[x].tx,max(d[x].lx,d[x].rx)); 43 } 44 if(ls&&!rs) 45 { 46 d[x].lx=max(d[ls].lx,d[ls].sum+d[x].val); 47 d[x].rx=max(d[ls].rx,0)+d[x].val; 48 d[x].tx=max(d[ls].tx,max(d[x].lx,d[x].rx)); 49 } 50 if(!ls&&rs) 51 { 52 d[x].lx=d[x].val+max(d[rs].lx,0); 53 d[x].rx=max(d[rs].rx,d[rs].sum+d[x].val); 54 d[x].tx=max(d[rs].tx,max(d[x].lx,d[x].rx)); 55 } 56 if(!ls&&!rs) 57 { 58 d[x].lx=d[x].rx=d[x].tx=d[x].val; 59 } 60 #undef ls 61 #undef rs 62 } 63 il void pushdown(int x) 64 { 65 #define ls d[x].ch[0] 66 #define rs d[x].ch[1] 67 if(d[x].tag!=nu) 68 { 69 d[ls].tag=d[rs].tag=d[ls].val=d[rs].val=d[x].tag; 70 d[ls].lx=d[ls].rx=d[ls].tx=max(d[x].tag,d[x].tag*d[ls].sz); 71 d[rs].lx=d[rs].rx=d[rs].tx=max(d[x].tag,d[x].tag*d[rs].sz); 72 d[ls].sum=d[ls].val*d[ls].sz; 73 d[rs].sum=d[rs].val*d[rs].sz; 74 d[x].tag=nu,d[x].rev=0; 75 } 76 if(d[x].rev) 77 { 78 swap(d[x].ch[0],d[x].ch[1]); 79 d[ls].rev^=1,d[rs].rev^=1,d[x].rev=0; 80 swap(d[ls].lx,d[ls].rx); 81 swap(d[rs].lx,d[rs].rx); 82 } 83 #undef ls 84 #undef rs 85 } 86 il void rot(int x) 87 { 88 int y=d[x].fa;int ff=d[y].fa;int px=idf(x);int py=idf(y); 89 con(d[x].ch[px^1],y,px),con(y,x,px^1),con(x,ff,py); 90 pushup(y),pushup(x); 91 } 92 il void splay(int x,int to) 93 { 94 to=d[to].fa; 95 while(d[x].fa!=to){ 96 int y=d[x].fa; 97 if(d[y].fa==to) rot(x); 98 else if(idf(y)==idf(x)) rot(y),rot(x); 99 else rot(x),rot(x); 100 } 101 } 102 int find_pos(int p) 103 { 104 int x=root; 105 while(1) 106 { 107 pushdown(x); 108 if(d[d[x].ch[0]].sz>=p){ 109 x=d[x].ch[0]; 110 continue; 111 }p-=d[d[x].ch[0]].sz; 112 if(p==1) return x; 113 p--,x=d[x].ch[1]; 114 } 115 } 116 int build(int l,int r,int ff) 117 { 118 if(l>r) return 0; 119 int mid=(l+r)>>1; 120 int x=cre(ww[mid]); 121 d[x].fa=ff; 122 d[x].ch[0]=build(l,mid-1,x); 123 d[x].ch[1]=build(mid+1,r,x); 124 pushup(x); 125 return x; 126 } 127 int gc() 128 { 129 int rett=0,fh=1;char p=getchar(); 130 while(p<'0'||p>'9') {if(p=='-')fh=-1;p=getchar();} 131 while(p>='0'&&p<='9'){rett=(rett<<3)+(rett<<1)+p-'0';p=getchar();} 132 return rett*fh; 133 } 134 void Ins(int pos,int num) 135 { 136 for(int i=1;i<=num;i++) ww[i]=gc(); 137 int x=find_pos(pos+1);splay(x,root); 138 int y=find_pos(pos+2);splay(y,d[root].ch[1]); 139 int rt=build(1,num,y);con(rt,y,0); 140 pushup(y),pushup(x); 141 } 142 void clr(int x) 143 { 144 if(d[x].ch[0]) clr(d[x].ch[0]); 145 if(d[x].ch[1]) clr(d[x].ch[1]); 146 des(x); 147 } 148 void Del(int pos,int num) 149 { 150 int x=find_pos(pos);splay(x,root); 151 int y=find_pos(pos+num+1);splay(y,d[x].ch[1]); 152 clr(d[y].ch[0]);d[y].ch[0]=0; 153 pushup(y),pushup(x); 154 } 155 void Same(int pos,int num,int val) 156 { 157 int x=find_pos(pos);splay(x,root); 158 int y=find_pos(pos+num+1);splay(y,d[x].ch[1]); 159 int rt=d[y].ch[0]; 160 d[rt].val=d[rt].tag=val; 161 d[rt].sum=val*d[rt].sz; 162 d[rt].tx=d[rt].lx=d[rt].rx=max(d[rt].val,d[rt].sum); 163 pushup(y),pushup(x); 164 } 165 void Rev(int pos,int num) 166 { 167 int x=find_pos(pos);splay(x,root); 168 int y=find_pos(pos+num+1);splay(y,d[x].ch[1]); 169 int rt=d[y].ch[0]; 170 d[rt].rev^=1; 171 swap(d[rt].lx,d[rt].rx); 172 } 173 int Getsum(int pos,int num) 174 { 175 int x=find_pos(pos);splay(x,root); 176 int y=find_pos(pos+num+1);splay(y,d[x].ch[1]); 177 int rt=d[y].ch[0]; 178 return d[rt].sum; 179 } 180 /* 181 void pro_dfs(int x) 182 { 183 pushdown(x); 184 //printf("%d %d %d %d\n",x,d[x].ch[0],d[x].ch[1],d[x].val); 185 if(d[x].ch[0]) pro_dfs(d[x].ch[0]); 186 if(d[x].ch[1]) pro_dfs(d[x].ch[1]); 187 pushup(x); 188 } 189 void mid_dfs(int x) 190 { 191 pushdown(x); 192 if(d[x].ch[0]) mid_dfs(d[x].ch[0]); 193 printf("%d ",d[x].val); 194 if(d[x].ch[1]) mid_dfs(d[x].ch[1]); 195 }*/ 196 int Maxsum() 197 { 198 int x=find_pos(1);splay(x,root); 199 int y=find_pos(n+2);splay(y,d[root].ch[1]); 200 //pro_dfs(root); 201 int rt=d[y].ch[0]; 202 return d[rt].tx; 203 } 204 205 206 int main() 207 { 208 n=gc(),m=gc(); 209 for(int i=1;i<=n;i++) ww[i]=gc(); 210 ww[0]=ww[n+1]=-inf,hd=0,tl=1; 211 root=build(0,n+1,0); 212 int x,y,z; 213 for(int i=1;i<=m;i++) 214 { 215 scanf("%s",qq); 216 if(qq[2]=='S'){ 217 x=gc(),y=gc(); 218 Ins(x,y);n+=y; 219 }else if(qq[2]=='L'){ 220 x=gc(),y=gc(); 221 Del(x,y);n-=y; 222 }else if(qq[2]=='K'){ 223 x=gc(),y=gc(),z=gc(); 224 Same(x,y,z); 225 }else if(qq[2]=='V'){ 226 x=gc(),y=gc(); 227 Rev(x,y); 228 }else if(qq[2]=='T'){ 229 x=gc(),y=gc(); 230 printf("%d\n",Getsum(x,y)); 231 }else{ 232 printf("%d\n",Maxsum()); 233 } 234 } 235 return 0; 236 }