AcWing 795. 前缀和

一. 题目详情

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

接下来再输入 mm 个询问,每个询问输入一对 l,rl,r。

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

输入格式

第一行包含两个整数 nn 和 mm。

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

接下来 mm 行,每行包含两个整数 ll 和 rr,表示一个询问的区间范围。

输出格式

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

数据范围

1≤l≤r≤n1≤l≤r≤n,
1≤n,m≤1000001≤n,m≤100000,
−1000≤数列中元素的值≤1000−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. sn = a1+a2+a3……+an 前缀和基本思想

  2. sn = an+s[n-1] 用于计算新的前缀和

  3. s[l,r] = s[r] - s[l-1] 用于计算l~r的和

三. 笔者代码

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
30
31
32
33
import java.util.Scanner;
/**一维前缀和*/
public class Main {
public static void main(String[] args) {
Scanner scanner =new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();

//初始化ai
int[] ai = new int[n+1];
for (int i = 1; i <= n; i++) {
ai[i] = scanner.nextInt();
}

//初始化si
int[] si = new int[n+1];
for (int i = 1; i <= n ; i++) {
si[i] = si[i-1] + ai[i];
}

//Sum(l,r) = sr-s(l-1);计算前缀和
int l,r,sum;
while(m-->0){
l = scanner.nextInt();
r = scanner.nextInt();
sum = si[r] - si[l-1];
//输出l~r的和
System.out.println(sum);
}

}
}