今天来讲一下我的线段树学习历程。
线段树的模版算法,就是将所给的数据存储在一个树中,可以快速的查找一个区间内的最值或一个区间的和,并支持单点或者区间的修改。
接下来先来讲一下最基础的单点修改以及查找最值
给定一组数字,假设我们需要查找某个区间的最值。
先来画一个图

其中每个方格上的两个数字表示区间。
接下来,我们假设这六个数的值分别为1,1,4,5,1,4
那么我们用红色的数将每个区间的最值表示在旁边
那么很显然,当我们要查询形如(4,6)的区间时,我们可以轻松得出答案。
那如果我们要查询的区间时(3,5)呢?
这时我们可以看出,(3,5)实际上是(3,3)和(4,5)的组合。
那么我们只需不断递归区间,当此时的区间被包含在查询区间内时,我们便返回这个值,并在回溯时记录最大值即可。
那么先来给出最基本的建树函数
const int maxn=1000005;
int tr[maxn];//这里用来记录每个区间节点的最值
int a[maxn];//这里用来记录n个数字,比如上图中的1,1,4,5,1,5
void build(int l,int r,int id)
{
if(l==r)//叶子节点
{
tr[id]=a[l];
}
int mid=(l+r)/2;
build(l,mid,id*2);//递归左儿子
build(mid+1,r,id*2+1);//递归右儿子
tr[id]=ma

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



