线段树(单点更新以及区间更新模版)

今天来讲一下我的线段树学习历程。

线段树的模版算法,就是将所给的数据存储在一个树中,可以快速的查找一个区间内的最值或一个区间的和,并支持单点或者区间的修改。

接下来先来讲一下最基础的单点修改以及查找最值

给定一组数字,假设我们需要查找某个区间的最值。

先来画一个图

其中每个方格上的两个数字表示区间。

接下来,我们假设这六个数的值分别为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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值