【模板】线段树区间合并

这篇博客介绍了如何使用线段树解决区间合并问题,重点在于高效处理查询最长连续1的长度。通过维护lsum、rsum、sum和color四个值,实现pushup()和query()操作,提供了一种优化后的线段树实现。

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

区间合并是一类问题的统称,种类很多,但在这篇博客中只需实现以下操作即可:
有一个01串,你有三种操作:

  • 1.将[a, b]中的所有数字改成0
  • 2.将[a, b]中的所有数字改成1
  • 3.询问[a, b]中最长连续的1的长度是多少

前两种操作其实可以算作一个操作,重点在于如何高效地解决第三种操作。
虽说平衡树也可以解决这类问题,但是这里我们使用线段树来解决。


这是一个经典的老套路

线段树维护四个值(可以缩成三个,使用第四个是为了加强程序的可读性),分别是:

  • lsum记录该区间左端点开始的最长连续的值为1区间
  • rsum记录该区间右端点开始的最长连续的值为1区间
  • sum记录该区间内最长连续的值为1的区间
  • color形象解释就是记录区间的“颜色”,具体操作是当这个区间全部是1时color置1,全部为0时color置0,否则置-1。在pushup()的时候会用到。

接下来来讲讲具体的操作

首先是重中之重 pushup() p u s h u p ( )

这里博主有点懒,就不画图了,相信听了讲解自己脑补一下也是能搞懂的(听起来真的很简单~~)。
开始假设当前节点为 this t h i s ,其左儿子为 lc l c ,右儿子为 rc r c ,且 lc l c rc r c 中四个值均准确无误,接下来要对 this t h i s 节点做 pushup() p u s h u p ( ) 操作。
分步骤讨论:

  • 1、计算 lsum l s u m
    脑补一下,当 lc l c color c o l o r 为1时(也就是说左儿子结点全部由1组成),那么 lsum l s u m 就是 lc l c
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值