今天复习线段树,有个地方还是蒙了()
这是区间加法的一段题解
inline void push_down(ll p,ll l,ll r)
{
ll mid=(l+r)>>1;
f(ls(p),l,mid,tag[p]);
f(rs(p),mid+1,r,tag[p]);
tag[p]=0;
}
inline void update(ll nl,ll nr,ll l,ll r,ll p,ll k)
{
if(nl<=l&&r<=nr)
{
ans[p]+=k*(r-l+1);
tag[p]+=k;
return ;
}
push_down(p,l,r);
ll mid=(l+r)>>1;
if(nl<=mid)update(nl,nr,l,mid,ls(p),k);
if(nr>mid) update(nl,nr,mid+1,r,rs(p),k);
push_up(p);
}
有一个地方不懂,假如一个点满足 nl<=l&&r<=nr
,那就会
ans[p]+=k*(r-l+1);
tag[p]+=k;
return ;
可是这个点上一次已经 push_down
过了,那不就相当于操作了两次吗
还有一个问题
这里有个 r-l+1
,但是如果当前需要修改的区间,中间有点不在修改范围内,那这个sum不就是错的吗