前缀和
原: a1, a2, a3, a4, …
前缀和: Si = a1 + a2 + a3 + a4 + … + ai S0 = 0
①如何求Si
②在l ~ r区间 Sr - Sl-1
用途
快速求出某一个静态数组(中间值不会修改)的某一个区间内所有数的和的时候,运用前缀和可以有效提高我们的效率
#include <iostream>
using namespace std;
const int N = 100010;
int n, m;
int a[N], s[N]; //a表示原数组,s表示前缀和数组
int main ()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i ++) scanf("%d", &a[i]);
//从i=1开始读入因为让a[0] = 0, 即s[0] = 0 ,做到公式s[r] - s[l - 1] 的统一
for (int i = 1; i <= n; i ++) s[i] = s[i - 1] + a[i]; //求前缀和
while (m --)
{
int l, r;
scanf("%d%d", &l, &r);
printf("%d\n", s[r] - s[l - 1]); //求(部分和)
}
return 0;
}
二维的前缀和——子矩阵的和
公式:s[x2][y2] = s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1]