ZLOJ 区间和
题目描述
给你一个简单的任务:求一个序列中连续一段的和。
输入
第一行两个整数n和m。
第二行n个整数,表示序列中的元素。
接下来m行,表示m个询问,每行两个整数a和b,表示询问序列中下标在[a,b]这个区间的和。
输出
对于m个询问,每个询问输出一个整数,表示这个区间的和。
样例输入
5 5
5 2 1 4 3
1 2
2 3
1 3
1 4
1 5
样例输出
7
3
8
12
15
提示
对于50%的数据,1<=n,m<=10000
对于100%的数据,1<=n,m<=100 000,序列中的元素范围是[0,10000]
本题请使用scanf和printf进行输入输出
非常经典,非常基础的一道题,时间限制位为1Sec,所以,循环嵌套的结果只能是超时,于是……
我们首先定义,前缀和为该序列第一位到该位所有元素的和,我们可以递归地定义它为:
前缀和(i)=前缀和(i-1)+序列(i);前缀和(0)=序列(0);
而假设你需要求[3,5]这个区间的和,非常惊讶地发现,
区间和(i , j )==前缀和(j)-前缀和(i);
这个结论在优化代码以及各个方面都有极其广泛的应用。
上代码。
#include<bits/stdc++.h>
using namespace std;
int n,m,alpha[100001],beta[100001],lo,li;
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&alpha[i]);
for(int i=1;i<=n;i++)
beta[i]=alpha[i]+beta[i-1];
while(m--){
scanf("%d %d",&lo,&li);
printf("%d\n",beta[li]-beta[lo-1]);
}
return 0;
}