前缀和相关题解
1. 一维前缀和
核心思路:
利用预处理将区间查询的时间复杂度从 O(N) 降至 O(1)。先构建一个前缀和数组,dp[i] 表示 [1, i] 区间内所有元素的累加和。根据定义,dp[i-1] 存储的是 [1, i-1] 的和,因此递推公式为 dp[i] = dp[i-1] + arr[i]。
当需要查询区间 [l, r] 的和时,直接利用公式 dp[r] - dp[l-1] 即可得到结果。
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, q;
cin >> n >> q;
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 - 1] << endl;
}
return 0;
}
2. 二维前缀和
核心思路:
类比一维情况,若我们能处理出从 (0, 0) 到 (i, j) 这片区域内所有元素的累加和,就能在 O(1) 时间内搞定矩阵内任意区域的累加和。
为了简化边界条件的处理,通常会在矩阵的最上面和最左边添加一行和一列 0。这样下标直接从 1 开始,可以直接访问 和 位置的值。



