我原先是把push_down放在下面的:
void update(int p,int x,int y,int k){//k=0或k=1为区间赋值,k=2为翻转
if(x<=t[p].l&&y>=t[p].r){
if(k==0||k==1){
t[p].pre=(t[p].r-t[p].l+1)*k;
t[p].add=k;
t[p].max[k]=t[p].lmax[k]=t[p].rmax[k]=(t[p].r-t[p].l+1);
t[p].max[k^1]=t[p].lmax[k^1]=t[p].rmax[k^1]=0;
}
else if(k==2){
t[p].rev^=1;
t[p].pre=(t[p].r-t[p].l+1)-t[p].pre;
swap(t[p].max[0],t[p].max[1]);
swap(t[p].lmax[0],t[p].lmax[1]);
swap(t[p].rmax[0],t[p].rmax[1]);
}
return ;
}
push_down(p);
int mid=(t[p].l+t[p].r)>>1;
if(x<=mid)update(p<<1,x,y,k);
if(y>mid)update(p<<1|1,x,y,k);
push_up(p);
}
但是只有20pts 但是我把push_up换到上面就A了
void update(int p,int x,int y,int k){//k=0或k=1为区间赋值,k=2为翻转
push_down(p);
if(x<=t[p].l&&y>=t[p].r){
if(k==0||k==1){
t[p].pre=(t[p].r-t[p].l+1)*k;
t[p].add=k;
t[p].max[k]=t[p].lmax[k]=t[p].rmax[k]=(t[p].r-t[p].l+1);
t[p].max[k^1]=t[p].lmax[k^1]=t[p].rmax[k^1]=0;
}
else if(k==2){
t[p].rev^=1;
t[p].pre=(t[p].r-t[p].l+1)-t[p].pre;
swap(t[p].max[0],t[p].max[1]);
swap(t[p].lmax[0],t[p].lmax[1]);
swap(t[p].rmax[0],t[p].rmax[1]);
}
return ;
}
int mid=(t[p].l+t[p].r)>>1;
if(x<=mid)update(p<<1,x,y,k);
if(y>mid)update(p<<1|1,x,y,k);
push_up(p);
}
为什么会有差别,来个dalao解释一下为什么(xiexiele)