• [tem]线段树练习


    1080 线段树练习

    单点修改,区间查询和

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #define m ((l+r)>>1)
    #define lson o<<1,l,m
    #define rson o<<1|1,m+1,r
    #define lc o<<1
    #define rc o<<1|1
    using namespace std;
    typedef long long ll;
    const int N=1e5+5,INF=1e9+5;
    inline int read(){
        char c=getchar();int x=0,f=1;
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    int n,a[N],M,op,x,y;
    int t[N<<2];
    void build(int o,int l,int r){
        if(l==r) t[o]=a[l];
        else{
            build(lson);
            build(rson);
            t[o]=t[lc]+t[rc];
        }
    }
    void add(int o,int l,int r,int p,int v){
        if(l==r) t[o]+=v;
        else{
            if(p<=m) add(lson,p,v);
            else add(rson,p,v);
            t[o]=t[lc]+t[rc];
        }
    }
    int query(int o,int l,int r,int ql,int qr){ 
        if(ql<=l&&r<=qr) return t[o];
        else{
            int ans=0;
            if(ql<=m) ans+=query(lson,ql,qr);
            if(qr>m) ans+=query(rson,ql,qr);
            return ans;
        }
    }
    int main(int argc, const char * argv[]) {
        n=read();
        for(int i=1;i<=n;i++) a[i]=read();
        build(1,1,n);
        M=read();
        for(int i=1;i<=M;i++){
            op=read();x=read();y=read();
            if(op==1){add(1,1,n,x,y);}
            else {printf("%d
    ",query(1,1,n,x,y));}
        }
        return 0;
    }

     PS:树状数组

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    const int N=1e5+5;
    inline int read(){
        char c=getchar();int x=0,f=1;
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    int n,Q,a[N],c[N],flag,l,r,x;
    inline int lowbit(int x){return x&-x;}
    void build(int n){
        for(int i=1;i<=n;i++){
            c[i]+=a[i];
            if(i+lowbit(i)<=n)
                c[i+lowbit(i)]+=c[i];
        }
    }
    void add(int x,int d){
        for(int i=x;i<=n;i+=lowbit(i)) c[i]+=d;
    }
    int sum(int x){
        int res=0;
        for(int i=x;i>0;i-=lowbit(i)) res+=c[i];
        return res;
    }
    int main(int argc, const char * argv[]) {
        n=read();
        for(int i=1;i<=n;i++) a[i]=read();
        build(n);
        Q=read();
        for(int i=1;i<=Q;i++){
            flag=read();
            if(flag==1){
                l=read();x=read();add(l,x);
            }else{
                l=read();r=read();
                printf("%d
    ",sum(r)-sum(l-1));
            }
        }
        return 0;
    }


    1082 线段树练习 3

    区间修改,区间查询和

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #define m (l+r)/2
    #define lson o<<1,l,m
    #define rson o<<1|1,m+1,r
    #define lc o<<1
    #define rc o<<1|1
    using namespace std;
    typedef long long ll;
    const int N=2e5+5,INF=1e9+5;
    inline int read(){
        char c=getchar();int x=0,f=1;
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    struct node{
        ll lazy,x;
    }t[N<<2];
    int a[N];
    void build(int o,int l,int r){
        if(l==r) t[o].x=a[l];
        else{
            build(lson);
            build(rson);
            t[o].x=t[lc].x+t[rc].x;
        }
    }
    void paint(int o,int l,int r,ll delta){
        t[o].lazy+=delta;
        t[o].x+=delta*(r-l+1);
    }
    void pushDown(int o,int l,int r){
        paint(lson,t[o].lazy);
        paint(rson,t[o].lazy);
        t[o].lazy=0;
    }
    void add(int o,int l,int r,int ql,int qr,ll v){
        if(ql<=l&&r<=qr) paint(o,l,r,v);
        else{
            pushDown(o,l,r);
            if(ql<=m) add(lson,ql,qr,v);
            if(m<qr) add(rson,ql,qr,v);
            t[o].x=t[lc].x+t[rc].x;
        }
    }
    ll query(int o,int l,int r,int ql,int qr){
        if(ql<=l&&r<=qr) return t[o].x;
        else{
            pushDown(o,l,r);
            ll ans=0;
            if(ql<=m) ans+=query(lson,ql,qr);
            if(m<qr) ans+=query(rson,ql,qr);
            return ans;
        }
    }
    int n,Q,flag,l,r,x;
    int main(){
        n=read();
        for(int i=1;i<=n;i++) a[i]=read();
        build(1,1,n);
        Q=read();
        for(int i=1;i<=Q;i++){
            flag=read();
            if(flag==1){
                l=read();r=read();x=read();
                add(1,1,n,l,r,x);
            }else{
                l=read();r=read();
                printf("%lld
    ",query(1,1,n,l,r));
            }
        }
    }
  • 相关阅读:
    JavaScript数组API
    爱上经典之王梦麟《阿美阿美》
    爱上经典之《蜗牛与黄鹂鸟》
    爱上经典之《兰花草》
    爱上经典之《让我们看云去》
    爱上经典之卓依婷《三月里的小雨》
    爱上经典之孟庭苇《冬季到台北来看雨》
    有故事看SQA作用
    转自scmlife趣谈质量管理与工程改进面试
    Mysql之批处理
  • 原文地址:https://www.cnblogs.com/candy99/p/5937113.html
Copyright © 2020-2023  润新知