CODE[VS] 2291 糖果堆
题目描述 Description
【Shadow 1】第一题
WJMZBMR买了很多糖果,分成了N堆,排成一列。WJMZBMR说,如果Shadow能迅速求出第L堆到第R堆一共有多少糖果,就把这些糖果都给他。
现在给出每堆糖果的数量,以及每次询问的L和R,你需要帮助Shadow,把每次询问的结果求出来。注意,你不需要考虑糖果被Shadow取走的情况。
输入描述 Input Description
第1行,2的整数N,M,分别表示堆数和询问数量;
第2行,N个整数Ai,表示第i堆糖果的数量;
第3-(M+2)行,每行2个整数Li, Ri,表示第i个询问是[Li, Ri]。
输出描述 Output Description
M行,对于每个询问,输出对应的和。
样例输入 Sample Input
5 5
1 2 3 4 5
1 5
2 4
3 3
1 3
3 5
样例输出 Sample Output
15
9
3
6
12
数据范围及提示 Data Size & Hint
对于50%的数据,1≤N,M≤100;
对于100%的数据,1≤N,M≤100000,0≤Ai≤1000,1≤Li≤Ri≤N。
海琴烟太美了。
鬼刀必大火。2333
这题乍一看,,挺简单的。
第一思路应该就是纯模拟吧。
循环输入l,r
再从l到r加起来,输出。
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 #include<cstring> 6 using namespace std; 7 8 int n,m,a[100002],l,r,ans; 9 10 int main() 11 { 12 scanf("%d%d",&n,&m); 13 for(int i=1;i<=n;++i) 14 scanf("%d",&a[i]); 15 for(int i=1;i<=m;++i) 16 { 17 scanf("%d%d",&l,&r); 18 for(int j=l;j<=r;++j) 19 { 20 ans+=a[j]; 21 } 22 printf("%d\n",ans); 23 ans=0; 24 } 25 return 0; 26 27 }
但是数据范围太大了,会t啊!
像这样,只有42分。
那么,我只能去借鉴别人的另外思路了。。
可以通过一些方法来减少循环次数嘛,
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 #include<cstring> 6 using namespace std; 7 8 int n,m,a[100002],l,r,sum[100002]; 9 10 int main() 11 { 12 scanf("%d%d",&n,&m); 13 for(int i=1;i<=n;++i) 14 { 15 scanf("%d",&a[i]); 16 sum[i]=sum[i-1]+a[i]; 17 } 18 while(m--) 19 { 20 scanf("%d%d",&l,&r); 21 printf("%d\n",sum[r]-sum[l-1]); 22 } 23 return 0; 24 }