#创作计划#个性线段树模版
2026-03-07 10:54:57
发布于:浙江
本篇只讲简单的线段树,仅建树、求区间最大/最小值。
其他大佬的模版都比较长,不易理解,读起来也比较费劲,今天分享一款比较简短的蒟蒻式模版
废话不多说,有点二叉树基础的狗友都知道:

(仅节点编码)
那么我们的模版也会根据这个小知识点进行扩张
1.建树
#include<bits/stdc++.h>
using namespace std;
int tree[405];
int a[105];
void build(int root,int l,int r)
{
if (l<r) return tree[root]=a[l];
int mid=(l+r)/2;
return tree[root]=min(build(root*2,l,mid),build(root*2+1,mid+1,r));//最小值
//return tree[root]=max(build(root*2,l,mid),build(root*2+1,mid+1,r));//最大值
}
int main()
{
int n;
cin>>n;
for (int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
return 0;
}
这就是建树,其中思路与归并排序类似,递归从根节点开始分别向其左子树与其右子树遍历建树
表示节点编号为的线段树节点的存值

橙色为原数组区间,红色为节点存值,黑色为节点编号。
本图以最大值建树为例
即节点存的值是其左子树与右子树中的最大值
举个栗子:节点1存的就是区间与区间合并所得的最大值
模拟过程
1.递归区间
条件不成立,递归结果
2.递归区间
条件不成立,递归结果
3.两个子区间条件成立,回溯至2
4.结果为,回溯至1
5.递归区间
条件不成立,递归结果
6.两个子区间条件成立,回溯至5
7.结果为,回溯至1
8.结果为,递归结束,建树成功
好了,咱们已经获得了一棵优美的维护最大值的线段树了,接下来就是查询了
2.查询
#include<bits/stdc++.h>
using namespace std;
int n,m,a[1000005];
int tree[4000005];//顺序存储法
int built(int root,int l,int r)//返回[l,r]的最大值
{
if (l==r) return tree[root]=a[l];//维护叶节点
int mid=(l+r)/2;
return tree[root]=max(built(root*2,l,mid),built(root*2+1,mid+1,r));
}
int query(int root,int l,int r,int ql,int qr)//返回[ql,qr]的最大值
{
if (qr<l||r<ql) return INT_MIN;//要求最大值返回最小值,反之亦然
if (ql<=l&&r<=qr) return tree[root];//叶子节点
int mid=(l+r)/2;
return max(query(root*2,l,mid,ql,qr),query(root*2+1,mid+1,r,ql,qr));//维护最大值
}
int main()
{
scanf("%d %d",&n,&m);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
built(1,1,n);
while(m--)
{
int x,y;
scanf("%d %d",&x,&y);
printf("%d\n",query(1,1,n, x,y));//查询区间
}
return 0;
}
全部评论 29
何意味
6天前 来自 重庆
2这位上来就开大
6天前 来自 浙江
1快去退役
6天前 来自 广东
0我和“百大游戏讨论组(团赛得奖免费拿皮肤)”的小伙伴都在ACGO等你,快用这个专属链接加入我们吧!https://www.acgo.cn/application/1953016091127824384
6天前 来自 重庆
0
而且大部分简单线段树的模板应该就是这样的吧,线段树模板理解起来也挺简单的
6天前 来自 浙江
1刚看了一个,感觉好长
6天前 来自 浙江
0额,长不代表难理解,我觉得线段树是最好理解的数据结构之一。
6天前 来自 浙江
0线段树代码很短啊
6天前 来自 广东
0
同时贴主的格式也有待加强
6天前 来自 浙江
1第一次发嘛
6天前 来自 浙江
0
而且只讲建树和查询区间最值的话我还不如用效率更高的 st表
6天前 来自 浙江
1单点修改加上太长,打算有空再发
6天前 来自 浙江
0主要是区间修改
6天前 来自 浙江
1额,我觉得模板难易和长度没关系吧
6天前 来自 浙江
1
额,你的这个,现在已经有两个帖子精华了,大概率不会加了
6天前 来自 浙江
1没事
6天前 来自 浙江
0额,我觉得线段树不讲修改没啥用
6天前 来自 浙江
1因为线段树就是因为 st表/前缀和 这种 的查询算法不支持修改才出现的
6天前 来自 浙江
1
d
5小时前 来自 上海
0w'w'w
6小时前 来自 浙江
0666
9小时前 来自 浙江
0666
9小时前 来自 浙江
0666
9小时前 来自 浙江
011
昨天 来自 浙江
0想要知道帖主性别请私信我哈哈哈哈
( 帖主我同学哈哈哈哈
昨天 来自 浙江
0wc,bro你咋上榜了,看来能加精
昨天 来自 浙江
0加个P,这个帖子格式和内容都不符合要求,而且已经有两篇精华贴了
昨天 来自 浙江
0p个p,我p个你p,p你个p个p,pppp
昨天 来自 浙江
0唐
昨天 来自 浙江
0
此帖的up主是我同学,女的
6天前 来自 浙江
0你想表达什么?
6天前 来自 浙江
0
你这个和模板线段树有什么区别?既然你只给出区间最值的模板,那看哪个文章不比看你的学到的更多?
6天前 来自 广东
0其它大佬的模版都比较长,不易理解,读起来也比较费劲,今天分享一款比较简短的蒟蒻式模版
何意味?你这个相比其它模板有什么优势吗?常数有优化吗?思路有简化吗?代码有更简短吗?
6天前 来自 广东
0拜托,我第一次写这玩意
6天前 来自 浙江
0无论写的怎样,最重要的是不能讲错的东西,还有 的格式不能拉
6天前 来自 广东
0
6天前 来自 浙江
0催更
6天前 来自 浙江
0














































有帮助,赞一个