1. 程式人生 > 實用技巧 >13.差分

13.差分

差分是字首和的逆運算

假如原陣列是a[1],a[2],...,a[n].

我們構造b陣列,b[1],b[2],...,b[n].

使得a[i] = b[1] + b[2] + ... + b[i]

使得a陣列是b陣列的字首和

b陣列就稱為a陣列的差分

差分的作用:

對b陣列求一遍字首和就可以得出a陣列

將b[l]加上c之後,從a[l],a[l + 1]一直到a[n]都會加上c

再將b[r + 1]減去c

然後就是初始化問題。

開始時我們假定a陣列全部都是0,那差分陣列b也全部都是0

然後我們看成是對a陣列進行了n次插入操作

也就是說,如果我們想把區間[l, r]整個加上一個數c的話,就讓b[l] + c,b[r + 1] - c即可。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N = 100010;
 4 int a[N], b[N];
 5 //a是原陣列
 6 //b是差分陣列 
 7 void insert(int l, int r, int c) { //在[l, r]之間加上c 
 8     b[l] += c;
 9     b[r + 1] -= c;
10 }
11 int main() {
12     int n, m;
13     cin >> n >> m;
14     for (int i = 1
; i <= n; i++) { 15 cin >> a[i]; 16 insert(i, i, a[i]); //構造b陣列 17 } 18 while (m--) { 19 int l, r, c; 20 cin >> l >> r >> c; 21 insert(l, r, c); 22 } 23 for (int i = 1; i <= n; i++) { //求所有操作後的陣列,就是求一遍字首和 24 b[i] += b[i - 1
]; 25 cout << b[i] << " "; 26 } 27 return 0; 28 }