zoukankan      html  css  js  c++  java
  • [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));
            }
        }
    }
  • 相关阅读:
    三个心态做人做学问 沧海
    成功走职场要找准自己的"快捷键" 沧海
    免费离线下载 拂晓风起
    Hibernate 获取某个表全部记录时 奇怪现象 (重复出现某个记录) 拂晓风起
    无法读取mdb 如果连接不了ACCESS mdb文件,就尝试安装MDAC 拂晓风起
    Netbeans 使用 Hibernate 逆向工程 生成hbm和pojo 拂晓风起
    如何点击单选框 radio 后面的文字,选中单选框 拂晓风起
    Java 连接access 使用access文件 不用配置 拂晓风起
    mysql下如何执行sql脚本 拂晓风起
    Hibernate配置access Hibernate 连接 access 拂晓风起
  • 原文地址:https://www.cnblogs.com/candy99/p/5937113.html
Copyright © 2011-2022 走看看