前缀和有什么用?

前缀和是一种预处理,用于降低查询时的时间复杂度。 举个例子:给定 n 个整数,然后进行 m 次询问,每次询问求一个区间内值的和。

如果用暴力写法,那每次询问都需要从区间左端点循环到区间右端点求和,时间复杂度较大。

但是如果使用前缀和就可以将它降到O(n + m)

算法思想

image-20230503115839749

795. 前缀和

输入一个长度为 n 的整数序列。

接下来再输入 m 个询问,每个询问输入一对 l, r

对于每个询问,输出原序列中从第 l 个数到第 r 个数的和。

输入格式

第一行包含两个整数 nm

第二行包含 n 个整数,表示整数数列。

接下来 m 行,每行包含两个整数 lr,表示一个询问的区间范围。

输出格式

m 行,每行输出一个询问的结果。

数据范围

1 ≤ l ≤ r ≤ n,
1 ≤ n,m ≤ 100000,
-1000 ≤ 数列中元素的值 ≤ 1000

输入样例:

1
2
3
4
5
5 3
2 1 3 6 4
1 2
1 3
2 4

输出样例:

1
2
3
3
6
10

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 100010;
int a[N], s[N];

int main(){

int n, m;
cin >> n >> m;

for(int i = 1; i <= n; i++) cin >> a[i];

// 计算前缀和
for(int i = 1; i <= n; i++) s[i] = s[i - 1] + a[i];

while(m --){
int l , r;
cin >> l >> r;
cout << s[r] - s[l - 1] << endl;
}

return 0;
}