牛客小白月赛5 区间 (interval)

 传送门

 题目大意就是给你长度为n的区间,然后有m次操作,操作完了再查询区间和。

  做法就是用前缀和和差分,这是我第一次用差分,首先设一个change数组用来存每个位置的变化值,先清0,假如是修改[l,r]区间,该区间每个数加p的话,c[l]+=p,c[r+1]-=p,之所以不是直接c[l]=p,c[r+1]=-p,是因为可能修改不止是一次,当然m次操作完了之后,此时c[i]还不是a[i]的变化值,要求啊a[i]的变化值,需要求c数组的前缀和,求完之后c[i]即是代表了a[i]的变化值了,对c数组和a数组同时求前缀和,然后m次操作后区间和就是a[r]-a[l-1]

#include<bits/stdc++.h>
using namespace std;
#define maxn 1000005
#define ll long long
ll a[maxn],c[maxn];
int main()
{
    memset(a,0,sizeof(a));
    memset(c,0,sizeof(c));
    int n,m,q,l,r,p;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=1;i<=m;i++)
    {
        cin>>q>>l>>r>>p;
        if(q==1)
            p=-p;
        c[l]+=p;
        c[r+1]-=p;
    }
    for(int i=1;i<=n;i++)
    {
        c[i]=c[i-1]+c[i];
        a[i]=a[i-1]+a[i]+c[i];
    }
    cin>>l>>r;
    cout<<a[r]-a[l-1]<<endl;
    return 0;
}

 

posted @ 2018-07-23 09:20  eason99  阅读(78)  评论(0编辑  收藏  举报