用数列求和的思路可以快速理解和熟悉
前缀和预处理时间$O(n)$,可以$O(1)$的查询两个区间的和
$S_n=a_1+a_2+a_3+…+a_n$
$S_{n-1}=a_1+a_2+a_3+…+a_{n-1}$
对于输入的处理
将上面两式做差
$S_n-S_{n-1}=a_n$
故$S_n=S_{n-1}+a_n$(我们就是用这种方式在输入的时候,预处理前缀和的)
对于输出的处理
要求某一段区间的和如$[l,r]$
$S_r = a_1+a_2+a_3+…+a_{r-1}+a_r$
$S_l = a_1+a_2+a_3+…+a_{l-1}+a_l$
假设我们用$S_r-S_l$,会发现把$a_l$也剪掉了,所以我们需要再加上一个$a_l$
即$S_r-S_l+a_l$
等于$S_r-(S_l-a_l)$
等于$S_r-S_{l-1}$
#include <iostream>
using namespace std;
constexpr int N = 1e5;
int a[N+50], s[N+50];
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
int n, m;
cin >> n >> m;
for(int i = 1; i <= n; ++i) {
cin >> a[i];
s[i] = s[i-1] + a[i];
}
for(; m--;) {
int l, r;
cin >> l >> r;
cout << s[r] - s[l-1] << "\n";
}
return 0;
}