首页 > 其他 > 详细

[tem]线段树练习

时间:2016-10-08 01:49:44      阅读:262      评论:0      收藏:0      [点我收藏+]

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;
}

 



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));
        }
    }
}

 

[tem]线段树练习

原文:http://www.cnblogs.com/candy99/p/5937113.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!