线段树入门 + 例题

目录

一、线段树简介

1、导入线段树

2、线段树的存储

二、线段树的操作

         1、建树

2、区间查询

3、区间修改

三、懒惰标记

1、懒惰标记的作用

2、代码

四、P3372【模板】线段树 1  的题解


一、线段树简介

1、导入线段树

如题,已知一个长度为 N 的数列,共有 M 次操作,每次操作读入 X

        X==1 读入 L,R,K,将区间 [L,R] 每个数加上 K。

        X==2 读入 L,R,求出区间 [L,R] 每个数的和。

  这是洛谷的P3372在你没学线段树之前,有两种很简单地方法:

方法一 方法二
名称 暴力 前缀和
区间加 k O(1) O(R-L+1)
区间求和 O(R-L+1) O(1)

这两种方法总有一个操作花的时间会很大,因此我们需要一个能使两个操作时间平衡的数据结构——线段树。

2、线段树的存储

 线段树的每个节点都是这样的:

其中 p 表示该结点编号,L,R表示下标,dat 表示 [L,R] 的区间和,而 p 的左子树编好为 2p ,右子树编号为 2p+1 ,p 所代表的 [L,R] 区间又被分成了两个一样大的区间,被左右子树所表示,那么 p 点的区间和就等于左右子树的区间和。 

根据上述所示,那么这七个数 2 5 1 6 4 7 3 存进一棵线段树就长这样:

一棵有 n 的节点的线段树是一颗深度为\log^n_{2}+1​(简称 k)的二叉搜索树,第 k-1 层有 2^{k-1}​ 个节点,所以前 k-1 层是 2^k-1​个节点,第 k 层则有2^k​个节点,所以一共要2​×2^{\log^n_{2}+1}-1​个节点

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值