线段覆盖 (线段树)

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

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

我们可以建一棵线段树

vvv 表示有多少个黑区间

lenlenlen 表示黑区间的总长度

tagtagtag 表示该区间添加的整布条数

显然答案就是线段树的根节点的数据

那么怎么维护这些信息?

我们继续记录一下信息:

lbdlbdlbd 表示该区间左端点是否覆盖

rbdrbdrbd 表示该区间右端点是否覆盖

先看如何上传

  • 如果 懒标记为正,那么整个区间显然全部被覆盖,那么 v=lbd−rbd=1v=lbd-rbd=1v=lbdrbd=1,len=r−l+1len=r-l+1len=rl+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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值