牛客小白月赛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;
}