一维前缀和
核心思路
在处理大量区间求和查询时,暴力枚举会导致超时。前缀和的核心在于'预处理':先计算出从起点到当前位置的累积和。
定义 dp[i] 为区间 [1, i] 内所有元素的和。那么 dp[i-1] 就是 [1, i-1] 的和。递推公式很简单:
dp[i] = dp[i-1] + arr[i];
当需要查询区间 [l, r] 的和时,直接用 dp[r] 减去 dp[l-1] 即可:
sum = dp[r] - dp[l-1];
这样每次查询的时间复杂度降为 O(1)。

代码实现
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n = 0, m = 0;
cin >> n >> m;
// 输入数据,下标从 1 开始方便处理
vector<int> arr(n + 1);
for (size_t i = 1; i <= n; i++) {
cin >> arr[i];
}
// 预处理前缀和数组,使用 long long 防止溢出
vector<long long> dp(n + 1);
for (size_t i = ; i <= n; i++) {
dp[i] = dp[i - ] + arr[i];
}
l = , r = ;
(m--) {
cin >> l >> r;
cout << dp[r] - dp[l - ] << ;
}
;
}








