前綴和&矩陣前綴和

前綴和

前綴和是一種重要的預處理,能大大降低查詢的時間複雜度。我們可以簡單理解爲“數列的前 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

我們先定義個矩陣sum

sum{_{x,y}}= \sum_{i=1}^{x}\sum_{j=1}^{y}a{_{i,j}}

那麼這個矩陣的前綴和就是:

就拿“15”來舉例:

 sum{_{2,3}}= sum{_{1,3}} + sum{_{2,2}} - sum{_{1,2}} + a{_{2,3}}

即 sum{_{2,3}} = 9 + 7 - 3 + 2 = 15

\Rightarrow sum{_{i,j}}= sum{_{i-1,j}} + sum{_{i,j-1}} - sum{_{i-1,j-1}} + a{_{i,j}}

應用

\left ( x_{1},y_{1} \right )-\left ( x_{2},y_{2} \right )子矩陣的和,類比以上的做法,易得:sum{_{x_{2},y_{2}}}- sum{_{x_{1}-1,y_{2}}} - sum{_{x_{2},y_{1}-1}} +sum{_{x_{1}-1,y_{1}-1}}

洛谷 P1387 最大正方形

題解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章