前缀和
前缀和
1)题设
输入一个长度为 n 的整数序列。
接下来再输入 m 个询问,每个询问输入一对 l,r。
对于每个询问,输出原序列中从第 l 个数到第 r 个数的和。
输入格式
第一行包含两个整数 n 和 m。
第二行包含 n 个整数,表示整数数列。
接下来 m 行,每行包含两个整数 l 和 r,表示一个询问的区间范围。
输入样例:
1
2
3
4
5
5 3
2 1 3 6 4
1 2
1 3
2 4
输出样例:
1
2
3
3
6
10
2)题解
![[截屏2025-03-07 21.50.33.png|500]]
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
28
29
const int N = 100010;
int a[N];//保存原数组
int s[N];//保存前缀和
int main(){
int n, m;
cin >> n >> m;
//a[0]手动设置为0,输入的数据从a[1]开始存放
for(int i = 1; i <= n; ++i){
cin >> a[i];
}
s[0] = 0;//这一步很关键,不能把s[0]设置为输入的第一个数!
//计算前缀和的方法
for(int i = 1; i <= n; ++i)
s[i] = s[i - 1] + a[i];
for(int i = 0; i < m; ++i){
int l, r; cin >> l >> r;//保存区间
//s[r] = a[1]+ ··· + a[r]
//s[l - 1] = a[1]+ ··· + a[l - 1]
//s[r] - s[l - 1] = a[l] + ··· + a[r]
cout << s[r] - s[l - 1] << endl;//是[l-1]而不是[l],可以画图理解
}
}
This post is licensed under CC BY 4.0 by the author.