$$\color{red}{算法}\color{blue}{基础课}\color{purple}{笔记and题解}\color{green}{汇总}$$
笔记:
差分是前缀和的逆运算,也就是构造一个$b$数组使$a$数组是$b$数组的前缀和。
也就是:
$b_1=a_1$
$b_2=a_2-a_1$
$b_3=a_3-a_2$
…
$b_n=a_n-a_{n-1}$
然而差分的作用在于:动态区间增量
1. 朴素算法:$O(n)$,$for$循环一遍。
2. 差分做法:$O(1)$,$b_l+c$,$b_{r+1}-c$。
代码:
#include <bits/stdc++.h>
using namespace std;
int n, a[100010], b[100010], q;
int main() {
scanf("%d%d", &n, &q);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
b[1] = a[1];
for (int i = 2; i <= n; i++) b[i] = a[i] - a[i - 1];
while (q--) {
int l, r, c;
scanf("%d%d%d", &l, &r, &c);
b[l] += c; b[r + 1] -= c;
}
for (int i = 1; i <= n; i++) b[i] += b[i - 1], cout << b[i] << " ";
return 0;
}