[kuangbin带你飞]专题七 线段树 C POJ 3468

来源:互联网 发布:数据信号避雷器 编辑:程序博客网 时间:2024/05/19 05:05

题目地址:https://vjudge.net/contest/66989#problem/C

思路:线段树上区间成段更新,意识到了不能像之前一样一个一个修改,想了一晚上,没什么好想法,就搜了一下题解。思路真是很巧妙,学到了。

原文地址:http://blog.csdn.net/acceptedxukai/article/details/6933446

AC代码:

#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn=1e5+10;int n,m;struct seg{int l,r;long long n,add;}T[maxn*4];void PushDown(int k,int m){    if(T[k].add)    {       T[k<<1].add+=T[k].add;       T[k<<1|1].add+=T[k].add;       T[k<<1].n+=T[k].add*(m-(m>>1));       T[k<<1|1].n+=T[k].add*(m>>1);       T[k].add=0;    }}void update(int c,int l,int r,int k){    if(T[k].l==l && T[k].r==r)    {        T[k].add+=c;        T[k].n+=(long long)c*(r-l+1);        return;    }    if(T[k].l==T[k].r) return;    PushDown(k,T[k].r-T[k].l+1);    int mid=(T[k].l+T[k].r)>>1;    if(r<=mid)        update(c,l,r,k<<1);    else if(l>mid)        update(c,l,r,k<<1|1);    else    {        update(c,l,mid,k<<1);        update(c,mid+1,r,k<<1|1);    }    T[k].n=T[k<<1].n+T[k<<1|1].n;}void build(int l,int r,int k){    T[k].l=l,T[k].r=r,T[k].add=0;    if(l==r)    {        scanf("%I64d",&T[k].n);        return;    }    int mid=(l+r)>>1;    build(l,mid,2*k);    build(mid+1,r,2*k+1);    T[k].n=T[2*k].n+T[2*k+1].n;}long long ans;void search(int l,int r,int k){    if(T[k].l==l && T[k].r==r)    {        ans+=T[k].n;        return;    }    PushDown(k,T[k].r-T[k].l+1);    int mid=(T[k].l+T[k].r)>>1;    if(r<=mid)        search(l,r,2*k);    else if(l>mid)        search(l,r,2*k+1);    else    {        search(l,mid,2*k);        search(mid+1,r,2*k+1);    }}int main(){    scanf("%d%d",&n,&m);    build(1,n,1);    for(int i=0;i<m;i++)    {        char aa[1];        scanf("%s",aa);        if(aa[0]=='Q')        {            int a,b;            scanf("%d%d",&a,&b);            ans=0;            search(a,b,1);            printf("%I64d\n",ans);        }        else if(aa[0]=='C')        {            int a,b,c;            scanf("%d%d%d",&a,&b,&c);            update(c,a,b,1);        }    }}


0 0