前缀和算法核心原理与实战应用
前缀和(Prefix Sum)是处理区间查询问题的经典技巧,通过预处理将单次查询的时间复杂度从 O(n) 降至 O(1)。本文将深入讲解一维与二维前缀和的推导过程,并结合哈希表优化解决子数组求和等进阶问题。
一、一维前缀和模板
核心思路
暴力解法每次查询都遍历区间,时间复杂度为 O(q*n)。使用前缀和数组 sum,其中 sum[i] 存储原数组下标 1 到 i 的元素累加和。计算区间 [l, r] 的和时,只需 sum[r] - sum[l-1]。
为了简化边界处理,通常将前缀和数组开大一位,令 sum[0] = 0,这样当 l=1 时,sum[l-1] 即 sum[0] 不会越界。

C++ 实现
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n = 0, q = 0;
cin >> n >> q;
vector<long long> sum;
sum.reserve(n + 1);
sum.push_back(0); // sum[0] = 0
for (int i = 1; i <= n; i++) {
int num = 0;
cin >> num;
sum.push_back(sum.back() + num);
}
while (q--) {
int l = 0, r = 0;
cin >> l >> r;
cout << sum[r] - sum[l - ] << endl;
}
;
}


