线段树介绍(segment tree)
1.引入
给定一个区间\([1, n]\),希望你实现一种数据结构,支持以下操作:
1.修改\(i\)号节点的值。
2.询问区间\([i, j]\)中所有节点的和。
这不是树状数组板子
3.修改区间\([i,j]\)中所有节点的值
4.询问\(i\)号节点的值
这不还是树状数组板子
如果我要求一个数据结构,同时满足这四个要求。那树状数组就不行了。
树状数组其实也行
这时候就要引入一个比树状数组更高级的数据结构——线段树
2.简介
线段树,顾名思义,就是一棵树一颗一个节点,保存一个区间的信息的树。如图,就是一个保存\([1,10]\)的线段树。
线段树的结构
我们记\(l,r\)为节点\(k\)所保存的区间的左右端点。显然,当\(l == r\)时节点\(k\)为叶子结点。根节点保存\([1,n]\)其余节点保存区间\([l,r]\)。对于任意一个非叶子结点,他又两个儿子为\(k << 1,k << 1 | 1\),分别保存区间\([l,(l + r) >> 1]\)和\([(l + r) >> 1 + 1,r]\)。
首先,我们引入两个函数:
\]
\]
我们用\(sum[k]\)表示\(k\)节点对应区间的区间和。易知\(sum[k] = sum[ls(k)] + sum[rs(k)]\)
这里我们举两个例子


这样,我们就可以把一个区间长度为\(L\)的区间划分成不超过\(2\log L\)个小区间,然后对这个小区间进行操作。因此每次操作的时间复杂度为\(O(\log n)\)对于\(n\)次操作时间复杂度为\(O(n \log n)\)。
预知后事如何,且听下回分解
线段树介绍(segment tree)的更多相关文章
- 线段树(Segment Tree)总结
0 写在前面 怎么说呢,其实从入坑线段树一来,经历过两个阶段,第一个阶段是初学阶段,那个时候看网上的一些教学博文和模板入门了线段树, 然后挑选了一个线段树模板作为自己的模板,经过了一点自己的修改,然后 ...
- 线段树(segment tree)
线段树是一种二叉搜索树,它的每一个结点对应着一个区间[L, R],叶子结点对应的区间就是一个单位区间,即L == R.对于一个非叶子结点[L, R],它的左儿子所表示的区间是[L, (L +R)/2] ...
- 【数据结构】线段树(Segment Tree)
假设我们现在拿到了一个非常大的数组,对于这个数组里面的数字要反复不断地做两个操作. 1.(query)随机在这个数组中选一个区间,求出这个区间所有数的和. 2.(update)不断地随机修改这个数组中 ...
- 第二十九篇 玩转数据结构——线段树(Segment Tree)
1.. 线段树引入 线段树也称为区间树 为什么要使用线段树:对于某些问题,我们只关心区间(线段) 经典的线段树问题:区间染色,有一面长度为n的墙,每次选择一段墙进行染色(染色允许覆盖),问 ...
- 线段树:Segment Tree(单点修改/区间修改模板) C++
线段树是非常有效的数据结构,可以快速的维护单点修改,区域修改,查询最大值,最小值等功能. 同时,它也很重要.如果有一天比赛,你卡在了一道线段树模板题目上,这就真的尴尬了.不过,随着时代的进步,题目也越 ...
- 【转】Senior Data Structure · 浅谈线段树(Segment Tree)
本文章转自洛谷 原作者: _皎月半洒花 一.简介线段树 ps: _此处以询问区间和为例.实际上线段树可以处理很多符合结合律的操作.(比如说加法,a[1]+a[2]+a[3]+a[4]=(a[1]+a[ ...
- 线段树(segment tree )
http://www.cnblogs.com/TenosDoIt/p/3453089.html 写的非常好! 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很 ...
- 李超线段树(segment[HEOI2013]-洛谷T4097)
(neng了好久好久才糊弄懂得知识点...) 一.李超线段树 在线动态维护一个二维平面直角坐标系, 支持插入一条线段, 询问与直线x = x0相交的所有线段中,交点y的最大/小值 (若有多条线段符合条 ...
- 区间树(segment tree)
区间树能够对保存的数据进行适当的预处理,以快速回复查询. 区间树常用于在一维数组的特定区间对查询进行快速回复.区间树的最典型也是最简单的应用就是求区间最小值的问题. 区间树的基本思路是,生成表示给定数 ...
- 线段树基本操作(Segment Tree)
线段树(Segment Tree) 入门模板题 洛谷oj P3372 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入格式 第一行包 ...
随机推荐
- 【SQL】SQL训练网站 SQLBlot
网站地址: https://sqlbolt.com/ Lesson1: -- https://sqlbolt.com/lesson/select_queries_introduction -- Fin ...
- 【SpringMVC】01 快速上手
环境搭建 EvBuild 环境组成: - JDK 1.8 + - IDEA 2018 + - Maven 3.0 + - Tomcat 8.0 + 搭建步骤: 1.创建Maven - SpringMV ...
- 【Mybatis】Bonus02 补充
关于主键生成问题 Mybatis的主键生成是基于JDBC的使用主键[getGeneratedKeys()]方法 也就是说,必须要JDBC驱动的支持才行 @Test public void junitT ...
- Google的TPU的向量化内存的读取规格——单次读取/写入的数据量
异构加速设备: GPU.TPU.NPU 这几种设备,除了GPU公开了部分硬件设计原理和软件编程范式以外,所有的TPU和NPU的资料都是不公开的,都是被其所属公司保留的,然后这些公司会自己在这些硬件之上 ...
- 强化学习中经典算法 —— reinforce算法 —— (进一步理解, 理论推导出的计算模型和实际应用中的计算模型的区别)
在奖励折扣率为1的情况下,既没有折扣的情况下,reinforce算法理论上可以写为: 但是在有折扣的情况下,reinforce算法理论上可以写为: 以上均为理论模型. ================ ...
- 是忧是喜?——微软撑腰,奥特曼重回OpenAI任CEO —— 争论点:AI发展规范化是否会损害美国在AI领域的领先地位 —— AI发展是否需要规范化
参考: https://mbd.baidu.com/newspage/data/landingsuper?context=%7B%22nid%22%3A%22news_1027953478745543 ...
- Linux的命令合集
Linux常用的命令 这里分享一个博客,里面有很丰富的Linux的常用指令. https://blog.csdn.net/qq_23329167/article/details/83856430. 然 ...
- cdq分治 提高篇
优化动态规划 序列 首先要会最长上升子序列的转移,这里就不说了. 我们 \(i\) 位置的初始值为 \(a_i\),可能变成的最大值为 \(mx_i\),可能变成的最小值为 \(mn_i\). 然后如 ...
- kafka查看未被消费的消息
$ kubectl exec -it gitee-kafka-0 -n gitee bash unset JMX_PORT $ kafka-consumer-groups.sh --bootstrap ...
- .netcore生命周期、消息管道
.NET Core 的初始化过程涉及多个步骤,这些步骤从应用程序的启动开始,一直到应用程序准备好处理请求.下面是一个简化的概述,描述了 .NET Core 应用程序(特别是 ASP.NET Core ...