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

来源:互联网 发布:ebody哪些好看知乎 编辑:程序博客网 时间:2024/05/20 22:27

https://vjudge.net/contest/66989#problem/C

区间修改

#include <cstdio>#include <algorithm>#include <iostream>#define lid (id << 1)#define rid (id << 1 | 1)using namespace std;const int maxn = 1e5+6;int n,a[maxn],m;struct node{    int l,r;    long long sum,lazy;    void updata(long long x)    {        sum =sum+(r-l+1)*x; //增加        lazy=lazy+x;    }} tr[maxn*4];void push_up(int id){    tr[id].sum=tr[lid].sum+tr[rid].sum;}void push_down(int id){    if(tr[id].lazy)    {        tr[lid].updata(tr[id].lazy);        tr[rid].updata(tr[id].lazy);        tr[id].lazy=0;    }}void build(int id,int l,int r){    tr[id].l=l,tr[id].r=r;    if(l==r) tr[id].sum=a[l],tr[id].lazy=0;    else    {        int mid=(l+r)/2;        build(lid,l,mid);        build(rid,mid+1,r);        push_up(id);    }}void updata(int id,int l,int r,long long val){    if(l==tr[id].l&&tr[id].r==r) tr[id].updata(val);    else    {        push_down(id);        int mid = (tr[id].l+tr[id].r)>>1;        if(r<=mid) updata(lid,l,r,val);        else if (l>mid) updata(rid,l,r,val);        else        {            updata(lid,l,mid,val);            updata(rid,mid+1,r,val);        }        push_up(id);    }}long long query_sum(int id,int l,int r){    if(l==tr[id].l&&tr[id].r==r) return tr[id].sum;    else    {        push_down(id);        int mid = (tr[id].l+tr[id].r)>>1;        if(r<=mid)  return query_sum(lid,l,r);        else if(l>mid) return query_sum(rid,l,r);        else return query_sum(lid,l,mid)+query_sum(rid,mid+1,r);        push_up(id);    }}int main(){    while(scanf("%d%d",&n,&m)==2)    {        for(int i=1;i<=n;i++) scanf("%d",&a[i]);        build(1,1,n);        char ch;        for(int i=1;i<=m;i++)        {            scanf(" %c",&ch);            if(ch=='Q')            {                int x,y; scanf("%d%d",&x,&y);                printf("%lld\n",query_sum(1,x,y));            }            else if(ch=='C')            {                int val,x,y;                scanf("%d%d%d",&x,&y,&val);                updata(1,x,y,val);            }        }    }}


原创粉丝点击