前缀和数组可以用来处理多次区间求和,构造前缀和数组的复杂度为O(n),查询区间和的复杂度为O(1)。若要求区间[l,r]的和,直接a[r] - a[l-1]即可。(a为前缀和数组)
差分数组是前缀和的逆运算,其用来处理多次区间修改,其复杂度为O(n) + O(m) ,暴力的复杂度为O(n*m) 。
/*
6 2
1 2 3 4 5 6
2 3 2
3 5 -5
注:2 3 2表示[2,3]区间范围内的数+2
输出修改后的原数组
*/
#include <iostream>
using namespace std;
int n, m;
int l, r, cc;
int a[10], b[10];
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
// 构造差分数组
b[1] = a[1];
for (int i = 2; i <= n; i++) {
b[i] = a[i] - a[i-1];
}
// 对差分数组进行操作
for (int i = 1; i <= m; i++) {
cin >> l >> r >> cc;
b[l] += cc;
b[r+1] -= cc;
}
// 还原原数组
a[1] = b[1];
for (int i = 2; i <= n; i++) {
a[i] = a[i-1] + b[i];
}
for (int i = 1; i <= n; i++) {
cout << a[i] << " ";
}
return 0;
}