上链接:https://www.luogu.com.cn/problem/B3612
上题干:
题目描述
给定 n 个正整数组成的数列 1,2,⋯ ,a1,a2,⋯,an 和 m 个区间[li,ri],分别求这 m 个区间的区间和。
输入格式
第一行,为一个正整数 n 。
第二行,为 n 个正整数 1,2,⋯ ,a1,a2,⋯,an
第三行,为一个正整数 m 。
接下来 m 行,每行为两个正整数 li,ri ,满足1≤li≤ri≤n
输出格式
共 m 行。
第 i 行为第 i 组答案的询问。
输入输出样例
输入 #1复制
4 4 3 2 1 2 1 4 2 3输出 #1复制
10 5说明/提示
样例解释:第 1 到第 4 个数加起来和为 10。第 2 个数到第 3 个数加起来和为 5。
对于 50% 的数据:n,m≤1000 ;
对于 100% 的数据:1≤n,m≤10^5,1≤ai≤10^4。
这是一道经典的前缀和。
在写之前,我们要明白前缀和是什么。
假设有一个一维的数组,那么从当前的下标,一直到起始的下标,这段区间的和,就是当前下标的前缀和。
假设有一个二维数组,那么从当前的下标(i,j)一直到起始点(0,0) 以(i,j)为右下角,以 (0,0)为左上角的矩形内部元素之和,被称为该点的前缀和。
所以,前缀和,就可以当成,数列的前n项和。
这样看的话,我们是不是就很能理解这道题了。
要求某个区间的和,我们只需要找到区间的两个端点,假设左端点的前缀和是S【l】,右端点的前缀和是S【r】,所以这个区间的所有元素的和就是 S【r】-S【l-1】 或S【r】-S【l】+a【l】;
上代码:
const int N = 1e5 + 10;
int a[N];
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
int temp;
cin >> temp;
a[i] = a[i - 1] + temp;
}
int m;
cin >> m;
for (int i = 1; i <= m; i++)
{
int x, y;
cin >> x >> y;
cout << a[y] - a[x-1]<<endl;
}
}