题目描述
前缀和思想
构造一个新的数组,使得该数组里的每个元素都是原来数组的前缀和
题解
1)构造一个新的数组s[N],使得该数组里的每个元素都是原来数组的前缀和
for(i=1; i<=n; i++)
{
scanf("%d",&a[i]);
s[i]=s[i-1]+a[i];
}
2)要求原来数组里下标从l到r的元素的和:
a[l]+a[l+1]+…+a[r]
则可以通过数组s[N]来求:
s[l-1]=a[1]+a[2]+…+a[l-1]
s[r]=a[1]+a[2]+…+a[l-1]+a[l]+…+a[r]
则a数组里小标从l到r的元素的和可以表示为:
s[r]-s[l-1]
完整代码
#include<stdio.h>
#define N 100001
int a[N],s[N];
int main(void)
{
int n,m,i; scanf("%d%d",&n,&m);
for(i=1; i<=n; i++)
{
scanf("%d",&a[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]);
}
}