首页 > 其他分享 >简单线段树

简单线段树

时间:2023-12-17 09:14:38浏览次数:31  
标签:结点 int 线段 建树 简单 区间 节点

一、什么是线段树?

  • 线段树是怎样的树形结构?

  线段树是一种二叉搜索树,每个结点都存储了一个区间,也可以理解成一个线段,你要从这些线段上进行搜索操作得到你想要的答案。

  • 线段树能够解决什么样的问题?

  线段树的适用范围很广,可以在线维护修改以及查询区间上的最值,求和。

  需要注意的是,线段树只可以维护满足结合律的信息。

  对于线段树来说,每次更新以及查询的时间复杂度为 \(O(\log n)\)。

  • 线段树和其他 \(\texttt{RMQ}\) 算法的区别

  常用的解决 \(\texttt{RMQ}\) 问题有 \(\texttt{ST}\) 表,二者预处理时间都是 \(O(n\log n)\)。

  但二者的区别在于线段树支持在线更新值,而 \(\texttt{ST}\) 表不支持在线操作。

二、线段树的原理

  线段树之所以称为“线段”树,是因为它的节点维护的信息是一个线段(即一个区间)的信息,而一个节点的两个儿子维护的信息是将当前节点维护线段(区间)分成两个线段,分别维护两个分成的线段(即子区间)的信息。

  而线段树的精髓在于:根据结合律,通过儿子节点(子区间)的信息合并得到更大区间的信息。

二、线段树的基本操作

1. 建树

建树包括三个要点:结点存什么结点下标是什么如何建树

image

  上图是关于 \(a[1\cdots6] = \{1,8,6,4,3,5\}\) 的区间最大值线段树,其中红色数字代表区间,蓝色数字代表当前区间最值。

  • 节点存什么

  可以发现,每个叶子结点的值就是数组的值,每个非叶子结点的度都为二,且左右两个孩子分别存储父亲一半的区间。每个父亲的存储的值也就是两个孩子存储的值的最大值

  • 结点下标是什么

  接着,我们采用完全二叉树的存储方法。即对于一个父节点 \(i\) 来说,它的左右儿子分别为 \(2i,2i+1\)。

  • 如何建树

  故此,在建树的时候,空间要开到 \(4n\) 以防止 RE。

  建树时每次递归就要先判断 \(l\) 是否等于 \(r\),等于就说明是叶子节点,也就是区间是 \([l,l]\),直接赋值成 \(a[l]\),再返回。

  否则就递归构造左儿子结点和递归构造右儿子结点,最后更新父节点。

inline void PushUp(int x) {
	sum[x] = sum[x << 1] + sum[x << 1 | 1];
}//由于结合律,所以根据两儿子的信息可以合并成父亲的信息
inline void Build(int l, int r, int x) {
	if(l == r) {
		sum[x] = a[l];
		return ;
	}
	int mid = l + r >> 1;
	Build(l, mid, x << 1);
	Build(mid + 1, r, x << 1 | 1);
	PushUp(x);
}

(注意,示例代码均为线段树 1 代码)

2、区间查询

image

  我们继续观察这棵线段树。

  现在我要查询 \([2,5]\) 区间的最值,如何处理呢?

  显然,此区间无法直接通过某一个节点的值直接求出;那么我们来看看有哪些区间被此区间包含。

  共有 \(5\) 个区间(黄色部分),而且我们可以发现 \([4,5]\) 这个区间已经包含了两个子树的信息(\([4,4],[5,5]\)),所以我们需要查询的区间只有三个,分别是 \([2,2],[3,3],[4,5]\)。

  我们还是从根节点开始往下递归,如果当前结点是被要查询的区间包含了的,则返回这个结点的信息,这样从根节点往下递归,时间复杂度也是 \(O(\log n)\)。

inline int Query(int L, int R, int l, int r, int x) {
	if(L <= l && r <= R) return sum[x];
	int mid = l + r >> 1;
	int ans = 0;
	if(L <= mid) ans += Query(L, R, l, mid, x << 1);
	if(R > mid) ans += Query(L, R, mid + 1, r, x << 1 | 1);
	return ans;
}

标签:结点,int,线段,建树,简单,区间,节点
From: https://www.cnblogs.com/cornulsyhj/p/17908747.html

相关文章

  • 简单实现mui-底部选项卡
    我在看官方的mui文档的时候发现并没有找到选项卡的位置,所以我并没有采纳可能是我太笨了吧接触的还少,先说说我原先是如何写底部选项卡的<navclass="mui-barmui-bar-tab"><aclass="mui-tab-itemmui-active"href="pSMain.html"> <spanclass="mui-icon"><imgsrc=......
  • Storm 集群的搭建及其Java编程进行简单统计计算
    一、Storm集群构建编写storm与zookeeper的yml文件 stormyml文件的编写具体如下:version:'2'services:zookeeper1:image:registry.aliyuncs.com/denverdino/zookeeper:3.4.8container_name:zk1.cloudenvironment:-SERVER_ID=1......
  • cuda编程的简单案例
    一个简单的案例:header.hvoidaddKernel(constint*a,constint*b,int*c,intsize); test.cu#include"cuda_runtime.h"#include"device_launch_parameters.h"#include"header.h"__global__voidadd(constint*a,constint*......
  • 237-CSS Flexbox模型布局的简单使用
    .div1{display:flex;flex-wrap:wrap;}.div1-1,.div1-2,.div1-3{flex:1;}.div1-4{flex:00100%;}/*可选:为更好的可视效果添加一些样式*/.div1>div{border:1pxsolid#ccc;padding:10px;margin:5px;}.div1-4input[type="text&quo......
  • 抖音无人直播必备——《小星星去重播放器》只需简单几个设置就能去重你的视频,让你的抖
     做抖音无人直播的朋友们,你是否还在靠剪辑拼接来达到视频去重的效果呢?是否也对平台的封禁处罚束手无策,万分苦恼?来看看这款专为无人直播而生的《小星星去重播放器》。只需要简单几个设置就能对视频进行全面去重,还不影响视频效果,让你的无人直播无需剪辑拼接,永远快人一步!如果你也是......
  • led车灯驱动线性芯片产品体积小外围简单AP5101c
    产品描述AP5101C是一款高压线性LED恒流芯片,外围简单、内置功率管,适用于6-100V输入的高精度降压LED恒流驱动芯片。最大电流2.0A。AP5101C可实现内置MOS做2.0A,外置MOS可做3.0A的。AP5101C内置温度保护功能,温度保护点为130度,温度达到130度时,输出电流慢......
  • CF1784C Monsters (hard version) 题解 线段树
    题目链接:https://codeforces.com/problemset/problem/1784/C题目大意:你面前有\(n\)只怪兽,每只怪兽都有一个初始血量,你可以进行两类操作:操作1:选择任意一个血量大于\(0\)的怪兽,并将它的血量降低\(1\);操作2:将所有存活的怪物的血量各自减去\(1\),如果存在怪物的血量恰好降为......
  • 基于dremio dbt 实现dremio 语义层建模的简单说明
    简单说明下基于dbt+dremio的语义层建模参考玩法如下图简单说明关于基于sql模式的语义层建模详细的可以直接参考官方文档,我只简单说明下关于dbt与dremio集成的集成简单说明对于每个领域的子模型,可以包含自己的s3(按需,也可以共享,但是注意命名区分),对于每个dbtproject......
  • dremio dbt adapter 一些简单说明
    dbt-dremio是dremio官方维护的dbtadapter,目前还在持续迭代中官方参考玩法实际上核心是基于dbt+dremio进行模型的创建内部集成玩法对于我们实际运行是需要对象存储服务的(比如使用minio),对象存储做为实际数据的物理存储,同时会使用apacheicerberg表存储格式对于模型是......
  • (原创)安卓快速使用简单的BottomNavigation(结合fragment)
    原创声明:本文所有图片和代码皆由本人制作和编写。目录前言目标效果第0步导入库第1步准备好一些资源fragmentdrawable图标第一小步第二小步第二步创建menu第三步创建navigation注意第四步绑定前言这篇文章是边写大作业边查资料边写的,查了很多资料,翻了很多论坛,也遇到了很多......