在 pushdown
中应该是
add(x<<1)+=add(x);
add(x<<1|1)+=add(x);
而非
add(x<<1)=add(x);
add(x<<1|1)=add(x);
当然,pushdown
还是比较容易写错的。下面是我的正解代码。其中:
- 先覆盖再加(这应该都知道吧)
- 覆盖的时候,清空左右儿子加法标记
void pushdown(int x){
if(~cov(x)){
mx(x<<1)=mx(x<<1|1)=cov(x);
cov(x<<1)=cov(x<<1|1)=cov(x);
add(x<<1)=add(x<<1|1)=0;
cov(x)=-1;
}
if(add(x)){
mx(x<<1)+=add(x);
mx(x<<1|1)+=add(x);
add(x<<1)+=add(x);
add(x<<1|1)+=add(x);
add(x)=0;
}
}
最后,在 modify_cov
(区间覆盖)中也要注意,当你给 x 结点覆盖时,要清空 x 结点的加法标记。