算法基础:前缀和实战
前缀和的核心思想是预处理。它能在暴力枚举的过程中快速查询到结果,相当于是对枚举的优化,是经典的用空间换时间的做法。
一维前缀和
思路解析
直观来看,暴力解法每次询问直接遍历区间 [l, r],复杂度是 O(n*m),在数据量大时显然不可接受。
由于我们需要计算的是连续区间的和,可以利用前缀数组来加速。假设定义 f[i] 为下标从 0 到 i 的数字之和(即前缀和),那么任意区间 [x, y] 的和就可以通过 f[y] - f[x-1] 快速得到。
这里有个细节需要注意:题目给出的是闭区间 [x, y],f[x] 包含了 v[x] 这个数,所以减去 f[x-1] 才能正好去掉 x 之前的部分,保留 x 到 y 的范围。

参考实现
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
// 使用 long long 防止溢出,多开一位方便处理边界
vector<long long> f(n + 1, 0);
for (int i = 1; i <= n; i++) {
long long num;
cin >> num;
f[i] = f[i - 1] + num; // 预处理前缀和数组
}
while (m--) {
int a, b;
cin >> a >> b;
cout << f[b] - f[a - 1] << endl;
}
return ;
}





