葛先生的收藏

描述
葛先生作为桃园19栋4楼首富,有着大把的钱。
你要问葛先生多有钱?他为了装下他的手办,专门买了几栋楼,楼里的每一间房间里都放上了各种各样的老婆。
今天,他心血来潮想要欣赏一下自己的收藏,于是他花钱找你帮他清点他的收藏。
葛先生总共有n个房间,每间房间里有ai个手办。现在葛先生会问你q次,每次他给你一对l,r, 你要告诉他第l个房间到第r个房间的手办加起来总共有多少。
Input
第一行输入两个用空格隔开的整数n,q(1≤n≤106,1≤q≤106)。
第二行输入n个整数,第i个整数代表ai(0≤ai≤109)。
接下来的q行,每行两个整数l,r(1≤l≤r≤n),表示葛先生想知道第l个房间到第r个房间的手办加起来总共有多少。
Output
输出q行,每行一个整数,第i行代表第i次询问的答案。
Examples
Input
5 3
1 2 3 4 5
1 5
2 3
1 3
Output
15
5
6
Input
1 1
1
1 1
Output
1
Input
5 1
1000000000 1000000000 1000000000 1000000000 1000000000
1 5
Output
5000000000

终终终终于AC了~真的都被自己的坚强打动了…

#include<iostream>//H chaoshi
#include<cstdio>
#include<cstring>
#define MAX 1000010
long long a[MAX]={0};//每个房间的手办数 
long long s[MAX]={0};//前i项和 
using namespace std;
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int n,q;
	cin>>n>>q;
	for(int i=1;i<=n;i++)
		cin>>a[i];	
	s[1]=a[1];
	for(int i=2;i<=n;i++){
		s[i]=s[i-1]+a[i];
	}
	while(q--){
		int l,r;
		cin>>l>>r;
		cout<<s[r]-s[l-1]<<"\n";
	} 
	return 0;
}

那么再来看看我惨痛的经历:
太心酸了

那我都错在哪里了:

  1. 第一次用的是给一组l,r,统计一次和,有很多重复计算,超时了;
  2. 改成了前缀和算法,数组从0开始,所以用s[r-1]-s[l-2], 这样当l是1是,出现-1,越界了;
  3. 将数组第一个元素设置为0,房间号和下标对上了,猜测可能是输入太慢了,用了 ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); 给流输入输出加速;
  4. 还是提示超时,能不能提示点别的啊啊啊啊,最后,发现数组开小了…将MAX改成1000010,过了。

最后能过还得谢谢许同学一直在帮我找bug, 太感谢他了啊啊啊。

猜你喜欢

转载自blog.csdn.net/qq_40486952/article/details/83901896