【线段树(递归版)】—— 点修改 区间覆盖 区间修改

线段树接触了也很久,但总是没一个安定的写法,各种花里呼哨的都写过,老实的时候连指针版的都写过。
但款式那么多并没有用,到时候用起来反而坑坑洼洼的,还不如定一个标准模式。


虽然是非递归的线段树代码简单而高效,但是万事慢慢来,从最基础简单的在博客开始写起。
此次我们介绍的是递归版的线段树。


“线段树是一种特殊的区间树“


线段树是什么东西?

简单的说,线段树是把 [1,n] 一段区间不断二分二分,直至每个树的节点是[i,i]的区间

                                               [1,7]

                            [1,4]                             [5,7]

                [1,2]          [3,4]                   [5,6]            [7,7]

        [1,1]    [2,2]        [3,3]  [4,4]      [5,5] [6,6]     

(线段树未必是一个满二叉树,但一定是个平衡二叉树)


/* 讨论在数组的情况下构造*/

Section A 基本操作

一、如何构造?

a)      如何构造左右子树关系?
假设根节点为root,左儿子lson 右儿子rson

不妨lson = root << 1 , rson = lson | 1
画一张图,把节点序号的二进制写出来你就知道为什么这么做

b)      如何建立树?
从最大的区间开始,每次二分 mid = (lson+rson) >> 1
递归建立lson,mid区间和mid+1,rson区间
当区间只有一个数的时候,保存数据

c)      更新:
在构造过程中首先是build(lson,mid),build(mid+1,rson)
然后需要发挥线段树的功能,能够快速询问维护一段区间的值比如

tree[root].max = max{tree[lson].max,tree[rson],max}

tree[root].sum = tree[lson].sum + tree[rson].sum

 

二、询问操作

a)      朴素法
在构造时,对于每个节点保存左右区间的范围。
然后递归寻找Query(root,L,R)
分三类情况:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值