算法实战:一维与二维前缀和模板详解
前缀和是一种经典的前缀处理技巧,主要用于解决区间求和问题。通过预处理将查询复杂度从 O(n) 降低到 O(1),在算法竞赛和实际工程中都非常实用。
一、一维前缀和
问题描述
给定一个长度为 n 的数组,进行 m 次询问,每次给出区间 [l, r],求该区间内所有元素的和。
算法思路
核心思想是构建一个前缀和数组 dp,其中 dp[i] 表示原数组从下标 1 到 i 的元素累加和。
- 预处理:利用递推公式
dp[i] = dp[i-1] + arr[i]计算前缀和数组。注意使用long long防止整数溢出。 - 查询:对于区间 [l, r],其和等于
dp[r] - dp[l-1]。
这种方法的优点是预处理一次后,每次查询仅需常数时间。
C++ 代码实现
#include <iostream>
#include <vector>
using namespace std;
int main() {
// 1. 输入数据
int n = 0, m = 0;
cin >> n >> m;
vector<int> arr(n + 1);
for (size_t i = 1; i <= n; i++) {
cin >> arr[i];
}
// 2. 预处理前缀和数组,使用 long long 防止溢出
vector<long long> dp(n + 1);
for (size_t i = 1; i <= n; i++) {
dp[i] = dp[i - 1] + arr[i];
}
// 3. 处理查询
int l = , r = ;
(m--) {
cin >> l >> r;
cout << dp[r] - dp[l - ] << ;
}
;
}




