[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\n",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\n",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\n",query(1,1,n,l,r));
        }
    }
}

 

posted @ 2016-10-07 23:27  Candy?  阅读(239)  评论(0编辑  收藏  举报