You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
线段树
基本信息
全称
线段树(Segment Tree)
起源与介绍
线段树是一种二叉树,可视为树状数组的变种,最早出现在2001年,由竞赛选手发明。
作用
此数据结构实际应用用途不大,但由于其程式易于实作而被广泛应用于程式竞赛当中。其用途是在O(logN)查询一个指定区间内的资讯,并可在同样的时间复杂度支援更新等操作。
基本概念
线段树是一种基于分治思想的二叉树,用于在区间上进行信息的统计。与按照二进制进行区间划分的树状数组相比,线段树是一种更加通用的结构;
区间试图:
二叉树视角:
线段树建树
首先用struct数组来存储线段树,代码如下:
1提问:欸,学长学长,这里为甚么是size * 4
接下来开始建线段树:
2提问:欸,学长学长,我没有问题,你有没有什么想告诉我的
线段树的单点修改
不用假设,我现在非常的闲,于是我准备修改数组arr【x】的值为val,于是线段树的某些值也就发生了变化;可以简单的想到单点修改的时间复杂度为O(logN)。
3提问:欸,学长学长,你有什么想说的吗
线段树的区间查询
还是不用假设,我就是闲,现在想查询序列arr在区间【left,right】上的最大值;我们需要从根节点开始,递归执行以下的过程:
时间复杂度的问题
线段树的懒标记(进阶)
接下来我们引入一道题目来进行进阶
线段树(模板1):(https://www.luogu.com.cn/problem/P3372)
懒标记是一个神奇的东西,为什么叫懒标记,因为它比较懒懒标记的精髓就是打标记和下传操作,由于我们要做的操作是区间加一个数,所以我们不妨在区间进行修改时为该区间打上一个标记,就不必再修改他的儿子所维护区间,等到要使用该节点的儿子节点维护的值时,再将懒标记下放即可,可以节省很多时间,对于每次区间修改和查询,将懒标记下传,可以节省很多时间参考资料:(线段树圣经)
Beta Was this translation helpful? Give feedback.
All reactions