差分
-
主要思想: 前缀和的逆操作
-
在b[l]加上一个常数C 会导致前缀和数组a[] 的所有添加b[l] 的前缀和都加C
- 原本O(n2)的操作 现在就是O(1)
- 先求差分数组 根据操作完的差分数组 求原数组(前缀和)
-
#include <iostream> using namespace std; const int N = 100010; int a[N], b[N]; void insert(int l, int r, int c) { //a[l~r]加上C a[r]以后的不加C b[l] += c; b[r + 1] -= c; } int main() { int n, m; cin >> n >> m; for (int i = 1; i <= n; i ++) { scanf("%d", &a[i]); //可以写 insert(i, i, a[i]); b[i] = a[i] - a[i - 1]; //根据输入的a[i],求得初始化b[i] } while (m --) { int l, r, c; cin >> l >> r >> c; insert(l, r, c);//m次循环操作后,得到最终改变后的差分数组b[i] } for (int i = 1; i <= n; i ++) { //可以写 b[i] += b[i-1]; 求和 a[i] = a[i - 1] + b[i]; //根据最终的b[i],求解变化后的a[i] printf("%d ", a[i]); //输出a[i] } return 0; }
-