题目描述
给定一个长度为 的数组 ,有 次询问,每次询问数组 在区间 的和。
输入格式
- 第一行一个整数 。
- 第二行 个整数表示数组 。
- 第三行一个整数 。
- 接下来 行,每行两个整数 。
输出格式
每一行对应每一个样例,输出一个整数表示答案。
样例输入
5
1 2 3 4 5
2
1 3
2 5
样例输出
6
14
思路
首先定义一个前缀和数组prefix,其中prefix[i]表示的是数组中从第一个元素到第i个元素的和。
程序开始时,首先将prefix[0]初始化为0。然后,程序读取输入的数组长度n,并读取n个元素,计算它们的前缀和并存储在prefix数组中。这个过程是通过一个for循环实现的,其中prefix[i]是通过prefix[i - 1] + a计算得到的,这里的a是当前读取的数组元素。
接下来,程序读取查询次数q,并进行q次查询。每次查询都会读取两个整数l和r,然后输出prefix[r] - prefix[l - 1]的值。这个值就是数组中从第l个元素到第r个元素的和。这是因为prefix[r]是从第一个元素到第r个元素的和,而prefix[l - 1]是从第一个元素到第l-1个元素的和,所以二者的差就是从第l个元素到第r个元素的和。
AC代码
#include <iostream>
#define ll long long
#define AUTHOR "HEX9CF"
using namespace std;
const int N = 1e6 + 7;
int n, q;
ll prefix[N];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
prefix[0] = 0;
cin >> n;
for (int i = 1; i <= n; i++) {
int a;
cin >> a;
prefix[i] = prefix[i - 1] + a;
}
cin >> q;
while (q--) {
int l, r;
cin >> l >> r;
cout << prefix[r] - prefix[l - 1] << endl;
}
return 0;
}