题意:
给定一组数据n个,然后有n个操作。每个操作指定起始位置和终止位置,以及一个要进行操作的数。在这个区间内的每个数都加上这个操作数,在操作结束的时候,输出最后的数组。
input:
第一行数组元素个数n和操作次数k,第二行数组元素。此后每行都是三个数,分别为起点和终点,以及操作数。
数据范围:
output:
最后的数据元素。

思路:
最简单的暴力算法,即依次将区间内的每个数都加上操作数,最后输出,但数据较大,超时。
差分:依次记录下每个数据与前一个数据的差,即前i项和等于数据中的a[i],经过该处理后,区间的数据计算即变成了两点之间的计算,不妨设操作数为c,则只需在a[l]+c,和a[r+1]-c即可。在进行n此操作时,累加得到每一项的最后结果输出即可。
代码:
#include <cstdio>
long long a[10000000];
long long n;
long long q;
int main(){
scanf("%lld %d",&n, &q);
long long b1=0;
long long b2=0;
for(int i=0;i<n; i++){
scanf("%lld",&b1);
a[i]=b1-b2;
b2=b1;
}
long long l,r,vau;
for(int i=0; i<q;i++){
scanf("%lld %lld %lld",&l,&r,&vau);
a[l-1]=a[l-1]+vau;
a[r]=a[r]-vau;
}
long long sum=0;
for(int i=0; i<n; i++){
sum+=a[i];
printf("%lld ",sum);
}
return 0;
}