关于线段树

线段树是一个很重要的维护多重信息的树型结构.

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时则与第一点的思想相同.

 

上一篇:RocketMQ入门到入土(七 )为什么同一个消费组设置不同tag会出现奇怪现象


下一篇:运算表达式求值模板