【C++】前綴和與差分

前綴和

前綴和:陣列前 n 項的和。
用途:快速計算區間 [l, r] 的和。
時間複雜度:O(n) 降到 O(1)。

#include <iostream>
using namespace std;

int main(){
    int n = 5;
    int a[n] = {1, 2, 3, 4, 5};
    int b[n];

    b[0] = a[0];
    for(int i=1; i<n; i++){
        b[i] = b[i-1] + a[i];
    }
    
    // 1 3 6 10 15

    int l = 1, r = 3;
    cout << b[r] - b[l-1];
}

差分

差分:陣列相鄰兩項的差值。
用途:快速在區間 [l, r] 加上一個數字 x。
時間複雜度:O(n) 降到 O(1)。

#include <iostream>
using namespace std;

int main() {
    int n = 5;
    int a[n] = {1, 2, 3, 4, 5};
    int d[n];

    d[0] = a[0];
    for(int i = 1; i < n; i++){
        d[i] = a[i] - a[i-1];
    }

    int l = 1, r = 3, x = 10;

    d[l] += x; // 使得從 l 之後,都會加 x
    d[r + 1] -= x; // 從 r + 1 之後,不應該繼續加 x,所以減回 x

    // 1 11 1 1 -9
    
    a[0] = d[0];
    for(int i = 1; i < n; i++){
        a[i] = a[i-1] + d[i];
    }

    for(int i = 0; i < n; i++){
        cout << a[i] << ' ';
    }
}
發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *