前缀和算法详解
前缀和(Prefix Sum)是处理区间查询问题的经典技巧,核心思想是通过预处理将单次查询的时间复杂度从 O(n) 降至 O(1)。无论是数组的一维区间求和,还是二维矩阵的子区域统计,亦或是结合哈希表解决子数组计数问题,前缀和都是高频考点。
一维前缀和
假设有一个数组 arr,我们定义前缀和数组 dp,其中 dp[i] 表示从下标 0 到 i 的所有元素之和。为了处理边界情况(如查询从下标 0 开始的区间),通常采用 1-based indexing,即 dp[i] 存储 arr[1...i] 的和。
状态转移方程:
dp[i] = dp[i-1] + arr[i]
区间查询:
若要计算 [l, r] 区间的和,公式为 dp[r] - dp[l-1]。这里减去 dp[l-1] 是为了剔除 l 之前的部分。
代码实现:
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, q;
cin >> n >> q;
// 使用 n+1 大小,下标从 1 开始,避免 l=1 时访问 dp[0] 越界
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];
}
// 处理查询
while (q--) {
l, r;
cin >> l >> r;
cout << dp[r] - dp[l - ] << endl;
}
;
}


