前缀和&矩阵前缀和

前缀和

前缀和是一种重要的预处理,能大大降低查询的时间复杂度。我们可以简单理解为“数列的前 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 最大正方形

题解

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