点击查看代码
// 利用-差分数组-解决问题
// 作用:快速解决“将某一个区间所有元素统一加上一个数”的操作
//1.预处理出来差分数组 f[i]表示:当前元素与前一个元素的差值 f[i] = a[i] - a[i - 1]
//(第二种方式:直接利用性质创建差分数组--可不必创建数组来存储原始数据 f[i] += a[i], f[i+1] -= a[i])
//2.利用差分数组解决 m 次操作
//性质:原数组[L, R]区间全部加上k这个操作相当于在差分数组中,f[L] += k, f[R + 1] -= k
//3.如何还原出原始的数组?
//直接对差分数组做前缀和运算即可
//注意事项:差分数组使用的时候,所有的操作必须全部进行完毕之后,才能还原出操作之后的数组
//(差分数组的适用范围,是比较局限的)
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
long long a[N];
long long f[N];
int main(){
int n, m;
cin >> n >> m;
for(int i = 1; i <= n; i++){
cin >> a[i]; //int x; cin >> x;
f[i] = a[i] - a[i - 1];//也可以性质:f[i] += x; f[i + 1] -= x;
}
while(m--){
long long l, r, k;
cin >> l >> r >> k;
f[l] += k;
f[r + 1] -= k;
}
for(int i = 1; i <= n; i++){
a[i] = a[i - 1] + f[i]; // <=> f[i] = f[i - 1] + f[i];
cout << a[i] << " "; // cout << f[i] << " ";
}
return 0;
}