模板 - 数据结构 - 线段树(单点修改)

Posted yinku

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板 - 数据结构 - 线段树(单点修改)相关的知识,希望对你有一定的参考价值。

这里是以区间最大值为例,要修改成其他的运算,注意修改每个函数的运算以及query中返回的无关值

这里的区间最大值设置的最小元素为-1(在query中表示与当前区间不相交的区间的结果)。

注意因为调用的方式传入l与r是(1,n),所以这个线段树(包括a)其实是从1开始计数的。

最后,小心爆MAXM

 

const int MAXM=200000;
int a[MAXM+5],st[(MAXM<<2)+5];
 
void build(int o,int l,int r){
    if(l==r) st[o]=a[l];
    else{
        int m=l+((r-l)>>1);
        build(o<<1,l,m);
        build(o<<1|1,m+1,r);
        st[o]=max(st[o<<1],st[o<<1|1]);
    }
}
 
void update(int o,int l,int r,int id,int v){
    if(l==r) st[o]=v;
    else{
        int m=l+((r-l)>>1);
        if(id<=m) update(o<<1,l,m,id,v);
        else update(o<<1|1,m+1,r,id,v);
        st[o]=max(st[o<<1],st[o<<1|1]);
    }
}
 
int query(int o,int l,int r,int a,int b){
    if(r<a||l>b) return -1;
    if(a<=l&&r<=b) return st[o];
    int m=l+((r-l)>>1);
    int p1=query(o<<1,l,m,a,b),p2=query(o<<1|1,m+1,r,a,b);
    return max(p1,p2);
}

 

以上是关于模板 - 数据结构 - 线段树(单点修改)的主要内容,如果未能解决你的问题,请参考以下文章

「模板」线段树静态开点(单点+区间修改)动态开点

线段树区间修改和查询和单点查询(线段树模板1)

树链剖分+线段树 单点修改 区间求和 模板

线段树单点修改区间修改单点查询值区间查询最大值最小值区间和之模板

HDU 1166 - 敌兵布阵 - [单点修改区间查询zkw线段树]

Chapter 3. 数据结构 线段树