在算法设计与优化中,前缀和是一种简单却强大的技巧,能够将复杂问题转化为高效计算。无论是处理一维数组的区间求和,还是解决二维矩阵的子矩阵问题,前缀和都能通过预处理将时间复杂度从线性降低到常数级别,彻底改变问题的解决方式。
前缀和
前缀和与差分的核心思想是预处理。它允许我们在暴力枚举的过程中快速给出查询结果,从而优化时间复杂度。这是一种典型的用空间换时间的策略。
前缀和: 快速求出数组中某一段区间和,单次查询时间复杂度为 O(1)。
1.1 一维前缀和
1.1.1 基础应用
处理区间求和时,如果直接对每个查询进行循环累加,时间复杂度为 O(n * q),数据量大时极易超时。采用前缀和策略后,我们可以先构建一个辅助数组,将查询操作降至 O(1)。
实现思路:
- 定义前缀和数组
f[i],表示原数组区间[1, i]中所有元素的和。 - 递推公式:
f[i] = f[i - 1] + a[i]。 - 查询区间
[l, r]的和,只需计算f[r] - f[l - 1]。
这种写法避免了重复计算,逻辑非常清晰。实际编码时注意数组下标通常从 1 开始,方便处理边界情况。
参考代码:
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
typedef long long LL;
int n, q;
LL a[N];
LL f[N]; // 前缀和数组
int main() {
cin >> n >> q;
for (int i = 1; i <= n; i++) cin >> a[i];
// 处理前缀和
for (int i = 1; i <= n; i++) {
f[i] = f[i - 1] + a[i];
}
// 处理 q 次询问
while (q--) {
int l, r;
cin >> l >> r;
cout << f[r] - f[l - 1] << endl;
}
return ;
}


