线段树是一个很重要的维护多重信息的树型结构.
1.维护区间和,加减乘除的修改
对有两个经典板子题lg3372 lg3373
总结一下lg3373的乘法tag,加法tag,区间v的变化值问题.
1. 在做乘法操作时,加法tag要乘上对应值
tree[k].tag1*=w;
关于这点意思乘法优先级高于加法,利用乘法分配律,乘法影响加法.
(k+add)*mul => k*w+add*mul,乘法的影响要在加法中体现.当然add=0时自然毫无影响.
2.pushdown时
I.tree[ls].v=(tree[ls].r-tree[ls].l+1)*tag1+tree[ls].v*tag2;
这点其实也好理解tag1=0时,就是乘法.同时tag2=1是就是加法.
当tag1!=0&&tag2!=1就是乘法分配律.(v+add)*mul =>v*mul+add*mul
而add*mul的操作在上一步已完成.rs则与ls相同.
II.tree[ls].tag1=tree[ls].tag1+tag1*tag2;
这里与第一点不同.当tag2=1时,经过操作tree[ls].tag1=tree[ls].ls+tag1符合.
tag2!=1时则与第一点的思想相同.