有一个东西叫做前缀和
前缀和是干什么用的呢?是用来求1-i的和
前缀和有一个公式:
for(int i=1;i<=n;i++) pre[i]=pre[i-1]+a[i];
举一个例子
数组: 3 1 5 2 4
pre[i]: 3 4 9 11 15
可以看pre中的4和9,pre[2]存的是1-2的和,如果要求pre[3]就把前面1-2的和加起来再加上a[3],前面1-2的和已经有了,就是pre[2]
所以前缀和不难,就是有点像递归,但更像累计求和
但如果要求一段区间的和呢,那么就还是有一个公式:pre[R]-pre[L-1]或者pre[R]-pre[L]+a[L];
画个图理解一下
那一道题来说一下
题目描述
N个数的数组:a[1],a[2],...,a[N]
给定子数组的左/右两端的下标L/R,求这个子数组的和 a[L]+a[L+1]+...+a[R]
输入格式
第1行包含一个整数N(N <= 200000)
第2行包含N个int范围内的整数,空格隔开
第3行包含一个整数T(T <= 10000),代表有T组询问
然后T行,每行包含2个整数L,R,满足1 <= L <= R <= N
输出格式
输出共 T 行,每行给出对应询问的结果
输入输出样例
输入 #1
4 1 2 4 3 2 1 4 2 3
输出 #1
10 6
说明/提示
对于60%的测试点:N<=100, T<=100
对于100%的测试点:N<=200000, T<=10000
这道题的话听懂了前面的求不难,直接放代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,T,a[200010],pre[200010];
int main(){
scanf("%lld",&n);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
scanf("%lld",&T);
for(int i=1;i<=n;i++) pre[i]=pre[i-1]+a[i];
//前面说的公式1
for(int i=1;i<=T;i++){
ll x,y;
cin>>x>>y;
printf("%lld\n",pre[y]-pre[x]+a[x]);
//前面说的公式2,直接输出即可
}
return 0;
}