码迷,mamicode.com
首页 > 其他好文 > 详细

POJ3468(线段树区间维护)

时间:2015-11-06 12:41:17      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:

#include<cstdio>
#define lson n<<1,l,mid
#define rson (n<<1)|1,mid+1,r
#define gmid (a[n].l+a[n].r)>>1
using namespace std;
const int MAX_N=100005;
typedef long long LL;
struct node{
    int l,r;
    LL sum,lazy;
}a[MAX_N<<2];
void PushUp(int n)
{
    a[n].sum=a[n<<1].sum+a[(n<<1)|1].sum;
}
void PushDown(int n)
{
    int mid =gmid;
    a[n<<1].sum+=a[n].lazy*(LL)(mid-a[n].l+1);
    a[(n<<1)|1].sum+=a[n].lazy*(LL)(a[n].r-mid);
    a[n<<1].lazy+=a[n].lazy;
    a[(n<<1)|1].lazy+=a[n].lazy;
    a[n].lazy=0;
}
void Build(int n,int l,int r)
{
    a[n].l=l;
    a[n].r=r;
    if(l==r)
    {
        scanf("%lld",&a[n].sum);
        a[n].lazy=0;
        return ;
    }
    int mid=gmid;
    Build(lson);
    Build(rson);
    PushUp(n);
}

void Update(int n,int l,int r,int val)
{
    if(a[n].l==l&&a[n].r==r)
    {
        a[n].lazy+=val;
        a[n].sum+=val*(LL)(r-l+1);
        return ;    
    }
    int mid=gmid;
    if(a[n].lazy)    PushDown(n);
    if(r<=mid)    Update(n<<1,l,r,val);
    else if(mid<l) Update((n<<1)|1,l,r,val);
    else{
        Update(lson,val);
        Update(rson,val);
    }
    PushUp(n);
}

LL Query(int n,int l,int r)
{
    if(a[n].l==l&&a[n].r==r)
    {
        return a[n].sum;
    }
    int mid=gmid;
    if(a[n].lazy) PushDown(n);
    if(r<=mid)    return Query(n<<1,l,r);
    else if(mid<l) return Query((n<<1)|1,l,r);
    else return Query(lson)+Query(rson);
}
int main()
{
    
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        Build(1,1,n);
        while(m--)
        {
            
            scanf("%*c");
            char op;
            scanf("%c",&op);
            if(op==Q)
            {
                int x,y;
                scanf("%d%d",&x,&y);
                printf("%lld\n",Query(1,x,y));
            }
            else
            {
                int x,y,v;
                scanf("%d%d%d",&x,&y,&v);
                Update(1,x,y,v);
            }
        }
    }
    return 0;
}

 

POJ3468(线段树区间维护)

标签:

原文地址:http://www.cnblogs.com/program-ccc/p/4941955.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!