前缀和
小明碰到了一个问题,有一个长度为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 }
大佬见笑,,