跳转到内容

前缀和

多次询问某个区间 [l, r] 的和。如果每次都循环累加会太慢,就可以先预处理前缀和。

s[i] 表示前 i 个数的总和,则区间 [l, r] 的和为 s[r] - s[l - 1]

#include <bits/stdc++.h>
using namespace std;
int main() {
int n, q;
cin >> n >> q;
vector<long long> s(n + 1, 0);
for (int i = 1; i <= n; i++) {
long long x;
cin >> x;
s[i] = s[i - 1] + x;
}
while (q--) {
int l, r;
cin >> l >> r;
cout << s[r] - s[l - 1] << '\n';
}
return 0;
}
  • s[0] 没有设置为 0。
  • 下标从 1 开始和从 0 开始混用。
  • 数据和可能很大,忘记使用 long long