25.【模板】前缀和
题目描述
给定一个长度为 n 的数组,进行 m 次查询,每次查询区间 [l, r] 内所有元素的和。
解法(前缀和)
算法思路
- 先预处理出来一个前缀和数组:用 dp[i] 表示区间 [1, i] 所有元素的和。dp[i-1] 里面存的就是 [1, i-1] 区间内所有元素的和。
- 递推公式:dp[i] = dp[i-1] + arr[i]
- 使用前缀和数组,快速求出某一个区间内所有元素的和:当询问的区间是 [l, r] 时,区间内所有元素的和为:dp[r] - dp[l-1]。
C++ 算法代码
#include <iostream>
#include <vector>
using namespace std;
int main() {
// 1. 输入数据
int n = 0, m = 0;
cin >> n >> m;
vector<int> arr(n + 1);
for (size_t i = 1; i <= n; i++) {
cin >> arr[i];
}
// 2. 预处理一个 dp 数组,防止溢出使用 long long
vector<long long> dp(n + 1);
for (size_t i = 1; i <= n; i++) {
dp[i] = dp[i - 1] + arr[i];
}
// 3. 使用前缀和数组
int l = 0, r = 0;
while (m--) {
cin >> l >> r;
cout << dp[r] - dp[l - 1] << '\n';
}
;
}


