线段覆盖 (线段树)

这篇博客探讨了一种使用线段树解决区间覆盖问题的方法。通过维护每个节点的黑区间数量(v)和黑区间的总长度(len),以及左端点(lbd)和右端点(rbd)的覆盖状态,可以有效地处理添加和删除黑布的操作。在更新和查询过程中,特别注意边界条件和懒标记的传递,确保线段树能够正确地反映出条状物上的黑区间信息。
摘要由CSDN通过智能技术生成

有一根长度为 L L L 的白色条状物。有两种操作:

  1. 用一条长度为 T T T 的黑布盖住条状物的 [ a , a + T ] [a,a+T] [a,a+T] 的这个区间
  2. 把某条黑布拿走

输入 L L L n n n 次操作,要你输出每次操作之后

  1. 条状物上有多少个黑区间
  2. 条状物上黑区间的总长度

观察出题目的询问每次都是一样的,其实也只有一种修改(添和删相当于互逆操作)

我们可以建一棵线段树

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=lbdrbd=1, l e n = r − l + 1 len=r-l+1 len=rl+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 (

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值