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






























































有帮助,赞一个