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