之前有道简单的求和:求出1加到n的和。
#include<stdio.h>
int main(){
int repeat,i,n,j;
long long sum;
scanf("%d",&repeat);
for(i=0;i<repeat;i++){
sum=0;
scanf("%d",&n);
for(j=1;j<=n;j++){
sum=sum+j;
}
printf("%lld\n",sum);
}
return 0;
}
可以简单的用循环解决便可求出1+2+……+n;
但如果要求的是 3加到8,7加到15等类似的中间的连加;
简单的for循环就不太行了。
但我们可以用前缀和
在正式运算前先算出s(n)=1+2+3……+n;
要用时在直接调用
e.g. 求3+4+……+8=s(8)-s(2)
7+8+……+15=s(15)-s(6)
以此类推
对任意正整数x,y;
若要求x+(x+1)+(x+2)+……+(y-2)+(y-1)+y=s(y)-s(x+1);
对于本题
题目描述
先给你n (1<=n<=100000)个数的数组A,再给你两个数X,Y(1=<X,Y<n),求sum=(A0+A1+....+Ax-1)+(Ay+Ay+1+.
..+An-1;
输入
有多组数据,每组数据的第一行有两个数字口,n,m(1<=m<=100000),表示数据的个数
和查询的个数,第二行是n个数据,第三行到mt3行每行有两个数x,Y (1<=X,Y<=n)
输出
对每个查询输出一个结果,每个结果占一行
样例输入
10 1
1 2 3 4 5 5 4 3 2 1
5 5
样例输出
30
//(讲道理下面代码没问题 但学校oj不让ac。。。
这个就可以了
#include<bits/stdc++.h>
using namespace std;
int a[100010]{0};
int sum[100010]{0};
void qianzhuihe(int n){
if(n>=1){
sum[1]=a[1];
}
for(int i=2;i<=n;i++){
sum[i]=sum[i-1]+a[i];
}
}
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
qianzhuihe(n);
for(int i=0;i<m;i++){
int X,Y;
cin>>X>>Y;
long long res=0;
res=sum[X]+sum[n]-sum[Y];
cout<<res<<endl;
}
}
总之就是前缀和。。。。。