前言
在算法设计与优化中,前缀和是一种简单却强大的技巧。无论是处理一维数组的区间求和,还是解决二维矩阵的子矩阵问题,它都能通过预处理将查询的时间复杂度从线性降低到常数级别。从经典的最大子段和问题到实际应用中的'激光炸弹'场景,前缀和不仅展现了数学的优雅,更体现了算法思维的灵活性。
本文将深入探讨一维和二维前缀和的原理与应用,揭示其如何通过'预谋'式的预处理,在竞赛与工程中成为改变游戏规则的关键。
前缀和
前缀和与差分的核心思想是预处理。它可以在暴力枚举的过程中快速给出查询结果,从而优化时间复杂度。这是一种典型的用空间换取时间的做法。
前缀和: 用于快速求出数组中某一段区间的和,单次查询时间复杂度为 O(1)。
1.1 一维前缀和
1.1.1 基础原理
暴力模拟实现时,若需多次查询,从指定下标循环累加会导致时间复杂度达到 O(n * q),极易超时。使用前缀和数组可以解决这个问题。
- 预处理:构建一个前缀和数组
f,其中f[i]表示区间[1, i]中所有元素的和。- 递推公式:
f[i] = f[i - 1] + a[i]
- 递推公式:
- 查询:计算区间
[l, r]的和,只需执行f[r] - f[l - 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 = ; i <= n; i++) cin >> a[i];
( i = ; i <= n; i++) {
f[i] = f[i - ] + a[i];
}
(q--) {
l, r;
cin >> l >> r;
cout << f[r] - f[l - ] << endl;
}
;
}




