警钟敲烂+疑惑
查看原帖
警钟敲烂+疑惑
536337
eb0ycn楼主2024/4/20 20:44

这是单点修改的线段树!修改一定要递归到叶子结点!

if(l==r){t[rt].lm=t[rt].rm=t[rt].s=t[rt].v=b;return;}

不能写成:

if(l==a)//a是修改位置
{t[rt].lm=t[rt].rm=t[rt].s=t[rt].v=b;return;}

还有就是查询时的合并操作,本来应该这样写的:

t[rt].s=t[rt<<1].s+t[rt<<1|1].s;
	t[rt].lm=max(t[rt<<1].lm,t[rt<<1].s+t[rt<<1|1].lm);
	t[rt].rm=max(t[rt<<1|1].rm,t[rt<<1|1].s+t[rt<<1].rm);
	t[rt].v=max(max(t[rt<<1].v,t[rt<<1|1].v),t[rt<<1].rm+t[rt<<1|1].lm);

但我第一行(也就是整个区间和)忘写了居然还能 AC,是为什么呢?

2024/4/20 20:44
加载中...