用于计算已知数组的任意一段区域的和。
例题:
输入一个长度为 n的整数序列。
接下来再输入 m 个询问,每个询问输入一对 l,r。
对于每个询问,输出原序列中从第 l 个数到第 r 个数的和。
注意:输入a数组时下标从1开始,输入的时候就开始算s数组
#include<iostream>
using namespace std;
const int N=100010;
int n,m;
int a[N],s[N];
int main(){
scanf("%d %d",&n,&m);
a[0]=s[0]=0;//从a[1]开始所以a[0]和s[0]需要等于0
int i;
for(i=1;i<=n;i++)scanf("%d",&a[i]);
for(i=1;i<=n;i++)s[i]=s[i-1]+a[i];//根据s[i]=s[i-1]+a[i]直接算出各项
while(m--){
int r,l;
scanf("%d %d",&l,&r);
printf("%d\n",s[r]-s[l-1]);
}
}
核心代码:
s[i]=s[i-1]+a[i];
l-r:s[r]-s[l-1];
还有二维前缀和:
注:所学来自acwing