差分与前缀和
作者:
无苦邪
,
2024-03-17 15:47:10
,
所有人可见
,
阅读 13
#include<bits/stdc++.h>
using namespace std;
/*
差分前缀和逆运算
差分指原数组 第i个元素和i - 1个元素的差异
b[1] = a[1] - a[0]
b[n] = a[n] - a[n - 1]
用处:如果需要对数组某个区间的每个数进行操作
暴力方法:进行for循环,然后对每个元素进行操作。时间复杂度O(n * m)
差分:原数组是差分数组的前缀和
所以b[l] + c 导致原数组从l开始都会加c
然后需要对b[r] - c ,然后r后部分恢复正常
*/
const int N = 1e5 + 10;
int a[N], b[N];
int main() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a[i];
// 构建差分数组
b[i] = a[i] - a[i - 1];
}
while (m--) {
int l, r, c;
cin >> l >> r >> c;
b[l] += c;
// 还包括a[r]
b[r + 1] -= c;
}
// 差分数组恢复原数组,前缀和
for (int i = 1; i <= n; i++) {
a[i] = a[i - 1] + b[i];
}
for (int i = 1; i <= n; i++) {
cout << a[i] << " ";
}
return 0;
}