#创作计划#个性线段树模版
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;
}
全部评论 47
何意味
1周前 来自 重庆
3这位上来就开大
1周前 来自 浙江
2快去退役
1周前 来自 广东
1我和“百大游戏讨论组(团赛得奖免费拿皮肤)”的小伙伴都在ACGO等你,快用这个专属链接加入我们吧!https://www.acgo.cn/application/1953016091127824384
1周前 来自 重庆
1
而且大部分简单线段树的模板应该就是这样的吧,线段树模板理解起来也挺简单的
1周前 来自 浙江
2刚看了一个,感觉好长
1周前 来自 浙江
0额,长不代表难理解,我觉得线段树是最好理解的数据结构之一。
1周前 来自 浙江
0线段树代码很短啊
1周前 来自 广东
0
good
5天前 来自 浙江
1同时贴主的格式也有待加强
1周前 来自 浙江
1第一次发嘛
1周前 来自 浙江
0后续改进
5天前 来自 浙江
0希望可以补上线段树各操作的时/空间(时间的话既然用了分治,单点修改和查询都是,
空间我也不会)复杂度,同时讲解优化方式(如果是刚学到就算了)。4天前 来自 广东
0
而且只讲建树和查询区间最值的话我还不如用效率更高的 st表
1周前 来自 浙江
1单点修改加上太长,打算有空再发
1周前 来自 浙江
0主要是区间修改
1周前 来自 浙江
1额,我觉得模板难易和长度没关系吧
1周前 来自 浙江
1
额,你的这个,现在已经有两个帖子精华了,大概率不会加了
1周前 来自 浙江
1没事
1周前 来自 浙江
0额,我觉得线段树不讲修改没啥用
1周前 来自 浙江
1因为线段树就是因为 st表/前缀和 这种 的查询算法不支持修改才出现的
1周前 来自 浙江
1
666
14小时前 来自 广东
0挺好的
15小时前 来自 浙江
0求点赞,拿罐头
昨天 来自 浙江
0?
昨天 来自 浙江
0可以收藏我的题单吗?
谢谢!2天前 来自 山西
0g
2天前 来自 浙江
0还行
2天前 来自 浙江
06
2天前 来自 广东
0建树部分void 不能返回值,你应该是想防抄袭,但是模版提供理论上不应该有这些东西。我结合上下文觉得你单纯写错了。
2天前 来自 重庆
0似乎是有这种写法的(?)
2天前 来自 浙江
0
你这只有建树+单查肯定短啊
4天前 来自 浙江
0这有啥值得创作计划的啊
4天前 来自 浙江
0
d
4天前 来自 江苏
0so?
4天前 来自 浙江
0删评何意味
5天前 来自 浙江
0没给你举报你就偷着乐吧,请注意你的言辞

5天前 来自 浙江
0我不希望看到在我的帖子下骂人的
5天前 来自 浙江
0请问我骂人了吗
5天前 来自 浙江
0
有人吗
5天前 来自 上海
0

























































有帮助,赞一个