算法基础课笔记and题解汇总
笔记:
差分是前缀和的逆运算,也就是构造一个b数组使a数组是b数组的前缀和。
也就是:
b1=a1
b2=a2−a1
b3=a3−a2
…
bn=an−an−1
然而差分的作用在于:动态区间增量
1. 朴素算法:O(n),for循环一遍。
2. 差分做法:O(1),bl+c,br+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;
}