前缀和算法详解与实战
前缀和是一种通过预处理数组来优化区间查询效率的经典技巧。核心思想是利用递推关系存储累积值,将区间求和时间复杂度从 O(N) 降至 O(1)。本文涵盖了一维与二维前缀和的构建原理及代码实现,结合典型例题展示如何将该思想应用于哈希表配合解决复杂问题。
一维前缀和
算法思路
假设有一个数组 arr,我们想快速计算任意区间 [l, r] 的元素和。直接遍历需要 O(N),而使用前缀和数组 dp,其中 dp[i] 表示 [0, i] 区间内所有元素的累加和(注意下标处理),就可以实现 O(1) 查询。
递推公式为:
dp[i] = dp[i-1] + arr[i]
当访问区间 [l, r] 时,区间和即为 dp[r] - dp[l-1]。这里要注意边界,通常为了方便处理,前缀和数组会比原数组多开一个位置,或者在逻辑上补全第 0 项。
代码实现
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, q;
cin >> n >> q;
// 使用 n+1 大小,方便处理从 1 开始的索引
vector<int> arr(n + 1);
for (int i = 1; i <= n; i++) cin >> arr[i];
// 初始化前缀和数组,使用 long long 防止溢出
vector<long long> dp(n + 1);
for (int i = 1; i <= n; i++) {
dp[i] = dp[i - 1] + arr[i];
}
int l, r;
while (q--) {
cin >> l >> r;
cout << dp[r] - dp[l - ] << endl;
}
;
}



