有一根长度为 L L L 的白色条状物。有两种操作:
- 用一条长度为 T T T 的黑布盖住条状物的 [ a , a + T ] [a,a+T] [a,a+T] 的这个区间
- 把某条黑布拿走
输入 L L L 和 n n n 次操作,要你输出每次操作之后
- 条状物上有多少个黑区间
- 条状物上黑区间的总长度
观察出题目的询问每次都是一样的,其实也只有一种修改(添和删相当于互逆操作)
我们可以建一棵线段树
v v v 表示有多少个黑区间
l e n len len 表示黑区间的总长度
t a g tag tag 表示该区间添加的整布条数
显然答案就是线段树的根节点的数据
那么怎么维护这些信息?
我们继续记录一下信息:
l b d lbd lbd 表示该区间左端点是否覆盖
r b d rbd rbd 表示该区间右端点是否覆盖
先看如何上传
- 如果 懒标记为正,那么整个区间显然全部被覆盖,那么 v = l b d − r b d = 1 v=lbd-rbd=1 v=lbd−rbd=1, l e n = r − l + 1 len=r-l+1 len=r−l+1
- 否则,那么我们要通过左右儿子的信息去得到它的信息
显然 l b d ( x ) = l b d ( l s ( x ) ) , r b d ( x ) = r b d ( r s ( x ) ) , l e n = l e n ( l s ( x ) ) + l e n ( r s (