警钟敲烂+疑惑

P4513 小白逛公园

eb0ycn @ 2024-04-20 20:44:00

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

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,是为什么呢?


|