线段树模板

Toretto·2022-03-02 21:57·71 次阅读

线段树模板

线段树模板

——更改值

 

 

复制代码
typedef long long ll;
const int maxn=1e6+10; //定义最大值
struct node{
    ll l,r,sum,tag;
} tree[maxn*4];//四倍空间保证不越界
ll a[maxn];

void pushdown(ll x){//将所需更改的保存在根位置的值向下推进以完成赋值
    if(tree[x].tag!=-1){
        tree[x<<1].sum=max(tree[x].tag,tree[x<<1].sum);
        tree[x<<1|1].sum=max(tree[x].tag,tree[x<<1|1].sum);

        tree[x<<1].tag=max(tree[x<<1].tag,tree[x].tag);
        tree[x<<1|1].tag=max(tree[x<<1|1].tag,tree[x].tag);

        tree[x].tag=-1;
    }
}

void change(ll p,ll l,ll r,ll x){//更改特定点的值
    if(tree[p].l==tree[p].r){
        tree[p].sum=x;
        return;
    }
    pushdown(p);
    ll mid=(tree[p].l+tree[p].r)>>1;
    if(mid>=l) change(p<<1,l,r,x);
    if(mid<r) change(p<<1|1,l,r,x);
    return;
}

void change_all(ll p,ll l,ll r,ll x){//给在根位置记录所需更改的最大值
    tree[1].tag=max(tree[1].tag,x);
    tree[1].sum=max(tree[1].sum,tree[1].tag);
    return;
}

void build(ll p,ll l,ll r){//构建线段树
    tree[p].l=l;
    tree[p].r=r;
    tree[p].sum=tree[p].tag=-1;
    if(l==r){
        tree[p].sum=a[l];
        return;
    }
    ll mid=(l+r)>>1;
    build(p<<1,l,mid);
    build(p<<1|1,mid+1,r);
}

ll query(ll p,ll l,ll r){//查询从p(一般为1)层开始的[l,r]内的值
    if(tree[p].l==tree[p].r){
        return tree[p].sum;
    }
    pushdown(p);
    ll mid=(tree[p].l+tree[p].r)>>1;
    if(l<=mid) return query(p<<1,l,r);
    if(r>mid) return query(p<<1|1,l,r);
}
复制代码

 

posted @   云憩风霞  阅读(71)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示