前缀和
前缀和是一种重要的预处理,能大大降低查询的时间复杂度。我们可以简单理解为“数列的前 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”来举例:
即
应用
求子矩阵的和,类比以上的做法,易得: