【poj 3468】A Simple Problem with Integers 题意&题解&代码(C++)

题目链接:
http://poj.org/problem?id=3468
题意:
操作,给区间加上某个值或区间修改。
代码:

#include
#include
#include
#define lson (id*2)
#define rson (id*2+1)
using namespace std;
long long tr[800005],lazy[800005],a[100005],ans;
void pushup(int id)
{ tr[id]=tr[lson]+tr[rson]; }
void pushdown(int id,int l,int r)
{
    int mid=(l+r)/2;
    tr[lson]+=lazy[id]*(mid-l+1);
    tr[rson]+=lazy[id]*(r-mid);
    lazy[lson]+=lazy[id];
    lazy[rson]+=lazy[id];
    lazy[id]=0;
}
void build(int id,int l,int r)
{
    if (l>r) return ;
    if (l==r) {tr[id]=a[l]; return ;}
    int mid=(l+r)/2;
    build(lson,l,mid);
    build(rson,mid+1,r);
    pushup(id);
}
void add(int id,int l,int r,int L,int R,long long c)
{
    if (l>r || l>R || rreturn ;
    if (l>=L && r<=R) 
    {
        tr[id]+=(r-l+1)*c;
        lazy[id]+=c;
        return ;
    }
    int mid=(l+r)/2;
    pushdown(id,l,r);
    if (L<=mid) add(lson,l,mid,L,R,c);
    if (R>=mid+1) add(rson,mid+1,r,L,R,c);
    pushup(id);
}
void query(int id,int l,int r,int L,int R)
{
        if (l>r || l>R || rreturn ;
        if (l>=L && r<=R)
        {
                ans+=tr[id];
                return ;
        }
        int mid=(l+r)/2;
        pushdown(id,l,r);
        if (L<=mid) query(lson,l,mid,L,R);
        if (R>=mid+1) query(rson,mid+1,r,L,R);
        pushup(id);
}
int n,m,x,y,c;
char p[5];
int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++)
    scanf("%lld",&a[i]);
    build(1,1,n);
    for (int i=1;i<=m;i++)
    {
        scanf("%s",p);
        if (p[0]=='C')
        {
            scanf("%d%d%d",&x,&y,&c);
            add(1,1,n,x,y,c);
        }
        else
        {
            ans=0;
            scanf("%d%d",&x,&y);
            query(1,1,n,x,y);
            printf("%lld\n",ans);
        }
    }   
}

你可能感兴趣的:(poj,线段树,oi之路,poj)