P3372 【模板】线段树 1 题解

本文介绍线段树这一数据结构,用于解决区间修改和区间查询的问题。线段树是一棵完全二叉树,每个节点维护一个线段的信息。通过线段树,区间查询的时间复杂度为O(logn),区间修改同样为O(logn)。文章通过维护区间和的例子解释了线段树的工作原理,并介绍了lazytag(延迟更新)的概念,用于优化区间修改的效率。
摘要由CSDN通过智能技术生成

博客园同步

原题链接

简要题意:

维护一个数组的区间修改,区间查询。

关于区间问题,其实有很多不错的算法。

当然 树状数组 也可以解决,不过为了给 后一道模板 做铺垫,我们将本题作为 线段树 的模板题讲解。

线段树什么?顾名思义,每个节点都维护了一个线段的信息,并且 线段树是一棵完全二叉树

比方说:

其中每个节点上写的三个数分别表示:节点编号,区间左端点,区间右端点 。有些节点只写了 节点编号 ,因为它们的 左端点 = 右端点,即元区间,写不下,见谅。

你会发现线段树有这样的性质:

  1. i i i 号节点的左儿子编号为 2 × i 2 \times i 2×i(如果存在的话),右儿子编号为 2 × i + 1 2 \times i + 1 2×i+1 (如果存在的话)。其实这是完全二叉树的性质。

  2. 如果 i i i 号节点维护的区间为 [ l , r ] [l,r] [l,r],则左儿子(如果存在)维护的区间为 [ l , ⌊ l + r 2 ⌋ ] [l,\lfloor \frac{l+r}{2} \rfloor] [l,2l+r],右儿子(如果存在)维护的区间为 [ ⌊ l + r 2 ⌋ + 1 , r ] [\lfloor \frac{l+r}{2} \rfloor + 1 , r] [2l+r+1,r]. 这有利于我们建树。

那么你会说了,嗯,这棵树确实挺不错的,但是能不能维护一些值呢?

——可以,只要是可结合的运算就可以(即可以分裂为两个区间分别计算,再按照某种方式合并的),不一定要满足结合律(比方说区间最大子段和就不满足结合律),比方说 最小值,最大值,区间和,区间异或和,区间最大子段和,区间相邻两数乘积,区间方差等。

你可能不明白是怎么维护的,那我们就样例:

1 5 4 2 3

维护区间和来举例。

此时每个节点从左往右依次为:节点编号,左端点,右端点,区间和。 (不好意思, 9 9 9 号节点的左右端点应该是 [ 2 , 2 ] [2,2] [2,2],口头更正一下)

这时你又发现两个性质:

  1. i i i 维护的区间 l = r l=r l=r,则 s u m sum sum(区间和) = a l = a r = a_l = a_r =al=ar.

  2. i i i 维护的区间 l ≠ r l \not = r l=r,则 s u m = l s u m + r

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值