题目描述
样例
思路分析
如果每次操作都暴力的给l,r之间的元素加一个数,那么复杂度会到达O(qn),超时。所以就想到要构造差分数组,将元素组的整个区间元素的变动转化为差分数组的单点变动。
差分相关知识:
原数组A,构造差分数组B(1<=i<=n)
B[1]=A[1],B[i]=A[i]-A[i-1];
A[i]=B[1]+B[2]……B[i];
A[L]~A[R]均加C,等价于B[L]+C,B[R+1]-C;
AC代码
#include<iostream>
#include<cstdio>
using namespace std;
//用scanf,不然又超时了,我裂开了
int main()
{
int n,q;
scanf("%d%d",&n,&q);
long long a[n+1],b[n+1],sum[n+1];
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
//求 差分数组B
b[1]=a[1];
for(int i=2;i<=n;i++)
{
b[i]=a[i]-a[i-1];
}
//进行q次操作
int l,r,c;
for(int i=0;i<q;i++)
{
scanf("%d%d%d",&l,&r,&c);
b[l]+=c;
b[r+1]-=c;
}
sum[1]=b[1];
for(int i=2;i<=n;i++)
{
sum[i]=sum[i-1]+b[i];
}
for(int i=1;i<=n;i++)
{
printf("%lld ",sum[i]);
}
return 0;
}