前綴和
前綴和是一種重要的預處理,能大大降低查詢的時間複雜度。我們可以簡單理解爲“數列的前 n 項的和”。
例題
有 N 個的正整數放到數組 A 裏,現在要求一個新的數組 B,新數組的第 i 個數 B[i]是原數組 A 第 0 到第 i 個數的和。
對於這道題,我們有兩種做法:
- 把對數組 A 的累加依次放入數組 B 中。
- 遞推: B[i] = B[i-1] + A[i] ,前提是 B[0] = A[0] 。
#include<bits/stdc++.h>
#define re register
#define f(i, a, b) for(re int i = a; i < b; i++)
using namespace std;
int N;
signed main(){
scanf("%d", &N);
int A[N + 1], B[N + 1];
f(i, 0, N) scanf("%d", &A[i]);
B[0] = A[0];
f(i, 1, N) B[i] = B[i - 1] + A[i];
f(i, 0, N) printf("%d ", B[i]);
printf("\n");
return 0;
}
二維/多維前綴和
其實前綴和幾乎都是基於容斥原理
eg.有這樣一個矩陣:
1 2 4 3
5 1 2 4
6 3 5 9
我們先定義個矩陣
那麼這個矩陣的前綴和就是:
就拿“15”來舉例:
即
應用
求子矩陣的和,類比以上的做法,易得: