逆天错误
查看原帖
逆天错误
1173109
OrientDragon楼主2025/2/1 22:19

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(区间覆盖)中也要注意,当你给 xx 结点覆盖时,要清空 xx 结点的加法标记。

2025/2/1 22:19
加载中...