【ETOJ P1049】【模板】前缀和 题解(数学+前缀和)

题目描述

给定一个长度为 n n n 的数组 a a a,有 q q q 次询问,每次询问数组 a a a 在区间 [ l , r ] [l, r] [l,r] 的和。

输入格式

  • 第一行一个整数 n n n ( 1 ≤ n ≤ 1 0 5 ) (1 \leq n \leq 10^5) (1n105)
  • 第二行 n n n 个整数表示数组 a a a ( − 1 0 9 ≤ a i ≤ 1 0 9 ) (-10^9 \leq a_i \leq 10^9) (109ai109)
  • 第三行一个整数 q q q ( 1 ≤ q ≤ 1 0 5 ) (1 \leq q \leq 10^5) (1q105)
  • 接下来 q q q 行,每行两个整数 l i , r i l_i, r_i li,ri ( 1 ≤ l i ≤ r i ≤ n ) (1 \leq l_i \leq r_i \leq n) (1lirin)

输出格式

每一行对应每一个样例,输出一个整数表示答案。

样例输入

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次查询。每次查询都会读取两个整数lr,然后输出prefix[r] - prefix[l - 1]的值。这个值就是数组中从第l个元素到第r个元素的和。这是因为prefix[r]是从第一个元素到第r个元素的和,而prefix[l - 1]是从第一个元素到第l-1个元素的和,所以二者的差就是从第l个元素到第r个元素的和。


AC代码

#include 
#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;
}

你可能感兴趣的:(Algorithm,Problems,c++,算法)