POJ3468- A Simple Problem with Integers

题目大意:

单样例,给定\(n\),表示数列有\(n\)个数,\(q\)次操作,两种操作如下。
\("Q ~~~ab"\),表示查询区间\([a,b]\)中的所有数的和。
\("C ~~~abc"\),表示将区间\([a,b]\)中的所有数加上\(c\)

思路:

线段树入门题,区间修改,区间求和,会炸\(int\)。此处仅用作复习,不进行基础的讲解,细节见代码。

Code:

#include<stdio.h>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define mid (l+r)/2
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
//线段树 区间修改 Lazy标记 区间求和
ll t,x,y,z,n,m;
char s[10];
ll q[maxn];
struct node{
    ll tr[maxn<<2],lazy[maxn<<2];
    void pushup(int rt){
        tr[rt]=tr[rt<<1]+tr[rt<<1|1];
    }
    void pushdown(int l,int r,int rt){//下传标记
        tr[rt<<1]+=(mid-l+1)*lazy[rt];
        tr[rt<<1|1]+=(r-mid)*lazy[rt];
        lazy[rt<<1]+=lazy[rt];
        lazy[rt<<1|1]+=lazy[rt];//标记累加
        lazy[rt]=0;//标记清空
    }
    void build(int l,int r,int rt){
        if(l==r){
            tr[rt]=q[l];
            return ;
        }
        build(lson);
        build(rson);
        pushup(rt);
    }
    void update(int L,int R,int l,int r,int rt,ll val){
        if(L<=l&&r<=R){
            tr[rt]+=(r-l+1)*val;//修改并累加
            lazy[rt]+=val;//标记累加
            return ;
        }
        if(lazy[rt]){
            pushdown(l,r,rt);
        }
        if(L<=mid){
            update(L,R,l,mid,rt<<1,val);
        }
        if(R>mid){
            update(L,R,mid+1,r,rt<<1|1,val);
        }
        pushup(rt);
    }
    ll query(int L,int R,int l,int r,int rt){
        if(L<=l&&r<=R){
            return tr[rt];
        }
        ll sum=0;
        if(lazy[rt]){
            pushdown(l,r,rt);
        }
        if(L<=mid){
            sum=(sum+query(L,R,lson));
        }
        if(R>mid){
            sum=(sum+query(L,R,rson));
        }
        return sum;
    }
    void init(){
        for(int i=1;i<=maxn*4-1;++i){
            lazy[i]=0;
        }
    }
}sgt;
int main(){
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;++i)scanf("%lld",&q[i]);
    sgt.build(1,n,1);    
    while(m--){
        scanf("%s",s);
        if(s[0]=='Q'){
            scanf("%lld%lld",&x,&y);
            printf("%lld\n",sgt.query(x,y,1,n,1));
        }   
        else{
            scanf("%lld%lld%lld",&x,&y,&z);
            sgt.update(x,y,1,n,1,z);
        }     
    }
    return 0;
}
posted @ 2021-03-17 22:42  Qquun  阅读(51)  评论(0)    收藏  举报