zcmu oj 1107 迟到的A+B(前缀和)(1218升级

之前有道简单的求和:求出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;
 }

}

总之就是前缀和。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值