POJ - 3468 A Simple Problem with Integers

题目链接

线段树区间修改,每个数均加上一个值。区间查询和。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<cmath>
using namespace std;

const int N = 1e5 + 50;
int n,m;

#define mid ((l + r) >> 1)
#define ls (nod << 1)
#define rs (nod << 1 | 1)
#define lson ls,l,mid
#define rson rs,mid + 1, r

struct Node{
    long long add,sum,len;
}t[N << 2];
void pushup(int nod){
    t[nod].sum = t[ls].sum + t[rs].sum;
}
void pushdown(int nod){
    if(t[nod].add == 0) return ;
    t[ls].add += t[nod].add; t[rs].add += t[nod].add;
    t[ls].sum += t[ls].len * t[nod].add; t[rs].sum += t[rs].len * t[nod].add;
    t[nod].add = 0;
}
void build(int nod,int l,int r){
    t[nod].add = 0; t[nod].len = r - l + 1;
    if(l == r){ scanf("%lld",&t[nod].sum); return ;}
    build(lson); build(rson); pushup(nod);
}
void update(int nod,int l,int r,int ll,int rr,long long v){
    if(l > rr || r < ll ) return ;
    if(ll <= l && r <= rr){
        t[nod].add += v; t[nod].sum += t[nod].len * v;
        return ;
    }
    pushdown(nod);
    update(lson,ll,rr,v); update(rson,ll,rr,v);
    pushup(nod);
}
long long query(int nod,int l,int r,int ll,int rr){
    if(l > rr || r < ll) return 0;
    if(ll <= l && r <= rr) return t[nod].sum;
    pushdown(nod);
    return query(lson,ll,rr) + query(rson,ll,rr);
}

int main(){
    scanf("%d%d",&n,&m);
    build(1,1,n);
    while(m --){
        char c; scanf(" %c",&c);
        if(c == 'Q') { int l,r; scanf("%d%d",&l,&r); printf("%lld\n",query(1,1,n,l,r)); }
        if(c == 'C') { int l,r,v; scanf("%d%d%d",&l,&r,&v); update(1,1,n,l,r,v); } 
    }
    return 0;
}
posted @ 2020-07-29 20:00  zhuzihan  阅读(73)  评论(0编辑  收藏  举报