1.概述
在可持久化线段树中,我们常常要使用区间修改操作。这时候,如果再用下传标记再向上更新的方式来实现就会变得十分麻烦。
那么,有没有一种实现线段树区间修改的方式可以不用下传标记或向上更新呢?有,那就是标记永久化。
2.原理
标记永久化的原理简单来说就是修改时一路更改被影响到的点,询问时则一路累加路上的标记,从而省去下传标记的操作。
3.代码实现
3.0 说明
这里以区间修改区间求和的线段树为例。
线段树中编号为p的结点的值和标记分别为val[p]和mark[p]。
3.1 建树
标记永久化线段树的建树和标记不永久化线段树的建树没有什么区别,这里就不在赘述,直接上代码吧。
procedure build(p,l,r:longint);
var
mid:longint;
begin
if (l=r) then
begin
read(val[p]);
exit;
end;
mid:=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1+1,mid+1,r);
val[p]:=val[p<<1]+val[p<<1+1];
end;
3.2 区间修改
0.设要将区间[x,y]中的数都加上v。
1.一路走下去同时更新路上受此次修改影响的节点的值,即inc(val[p],(y-x+1)*v)。
2.当目前结点所代表的区间与待修改区间完全重合时,更新标记&#x