主要就是lazytag这儿嘛.
每个线段树限度节点记录这些信息:sum,p,q,tag,pre,suf
分别表示区间p,q中,有sum个不同的颜色,tag表示lazy标记,-1表示没有标记,其他表示把这个区间染成tag颜色;pre表示这个区间左端点的颜色,suf表示右端点
更新和询问的时候先下传标记.这个不说了,和其他lazy标记一样的
下传标记的时候,直接清空标记,把pre和suf设置为tag的颜色,sum=1,并且把标记给儿子(如果有的话)
然后就是更新节点的操作(记这个节点为u,左儿子为l,右儿子为r)
首先下传来l和r的标记,然后
u.pre = l.pre;
u.suf = r.suf;
u.sum = l.sum + r.sum - (l.suf == r.pre);
说明一下最后一个
首先把u.sum设为l.sum + r.sum,
但是当左儿子后缀的颜色和右儿子前缀的颜色一样的时候,这两段颜色实际是同一段,我们多算了一次,于是减去
其他的就没什么了吧