乐逍遥xwl

导航

前缀和

小明碰到了一个问题,有一个长度为n(n<100000)数组和总询问次数m(m<100000),每次询问都要回答这个区间所有数字的总和,小明已经很累了,所以他把这个问题交给你。

输入格式:

第一行两个数n,m 下一行n个数a1,a2,a3......an. 然后m次询问. 每次给出l,r (1<=l<=r<=n)

输出格式:

每次询问输出区间所有数的和.

输入样例:

5 3
1 2 3 4 5
1 5
2 4
3 3

输出样例:

15
9
3

思路:如果对于不会前缀和的小白(就是本小白了)来说,可能直接就暴力做了,但是出题人就是要考你前缀和这个知识点,不超时那也说不过去,
简单来讲,前缀和就是新建一个sum数组,记录从开始到当前位置的所有数据和,然后对于询问区间[left,right]的和就等于sum[right]-sum[left-1],
left要减一是因为left的边界值也要算上,应该不难理解......


 1 #include<iostream>
 2 #include<cstring>
 3 #include<cmath>
 4 #include<cstdio>
 5 #include<algorithm>
 6 #include<map>
 7 #include<vector>
 8 #include<set>
 9 using namespace std;
10 #define ll long long 
11 #define inf 99999999
12 const int maxn=100005;
13 ll int num[maxn];//记录原始数据 
14 ll int sum[maxn];//记录前缀和 
15 int main()
16 {
17     memset(num,0,sizeof(num));
18     memset(sum,0,sizeof(sum));
19     int n,m;
20     scanf("%d%d",&n,&m);
21     //sum[0]=0;
22     for(int i=1;i<=n;i++)
23     {
24         scanf("%lld",&num[i]);
25         sum[i]=num[i]+sum[i-1];
26     }
27     for(int i=1;i<=m;i++)
28     {
29         int left,right;
30         scanf("%d%d",&left,&right);
31         printf("%lld\n",sum[right]-sum[left-1]);
32     }
33     return 0;
34 }


posted on 2019-05-04 12:10  乐逍遥xwl  阅读(242)  评论(0编辑  收藏  举报