CodeVS 1082 (区间修改+区间查询树状数组模板)

来源:互联网 发布:淘宝手机端设置首页 编辑:程序博客网 时间:2024/06/05 10:44

题意:

两种操作:

1.区间修改

2.求区间和

参考博客:http://blog.csdn.net/fsahfgsadhsakndas/article/details/52650026

代码:

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 2e5+7;ll arr[maxn],c1[maxn],c2[maxn];int n,q;void add(ll r[],int k,int v){    while(k<=n)    {        r[k] += v;        k += k&(-k);    }}ll getSum(ll r[],int k){    ll res = 0;    while(k>0)    {        res += r[k];        k -= k&(-k);    }    return res;}int main(){    scanf("%d",&n);    for(int i = 1;i<=n;i++)        scanf("%lld",arr+i);    arr[0] = 0;    memset(c1,0,sizeof(c1));    memset(c2,0,sizeof(c2));    for(int i = 1;i<=n;i++)        add(c1,i,arr[i]-arr[i-1]),add(c2,i,(i-1)*(arr[i]-arr[i-1]));    scanf("%d",&q);    while(q--)    {        int type;        scanf("%d",&type);        if(type==1)        {            int l,r,v;            scanf("%d%d%d",&l,&r,&v);            add(c1,l,v),add(c1,r+1,-v);            add(c2,l,v*(l-1)),add(c2,r+1,-v*r);        }        else        {            int l,r;            scanf("%d%d",&l,&r);            ll sum1,sum2;            sum1 = r*getSum(c1,r)-getSum(c2,r);            sum2 = (l-1)*getSum(c1,l-1)-getSum(c2,l-1);            printf("%lld\n",sum1-sum2);        }    }    return 0;}

原创粉丝点击