输入样例:
5 3
2 1 3 6 4
1 2
1 3
2 4
输出样例:
3
6
10
解题思路:
前缀和问题为:求一个静态数组的任意两位置之间的元素和,使得查询得效率为O(1)。只需要维护一个s[i]数组,使得s[j]表示为原数组中前j项和为s[j]。就相当与数列中的Sn。
前缀和与树状数组及线段树区别:
- 前缀和查询效率为O(1),而后者效率为O(logn),且常数大。
- 前缀和只能对静态数组进行查询,当数组中有元素变化时失效,而后者元素变化查询不受影响。
Java代码:
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] split = br.readLine().split(" ");
int n = Integer.parseInt(split[0]);
int m = Integer.parseInt(split[1]);
int []arr = new int[n + 1];
int []s = new int[n + 1];//维护一个s数组
split = br.readLine().split(" ");
for(int i = 0; i < n; i++) {
arr[i + 1] = Integer.parseInt(split[i]);//第一个元素下标置为1
}
for(int i = 1; i <= n; i++) {
s[i] = s[i -1] + arr[i];
}
for(int i = 0; i < m; i++) {
split = br.readLine().split(" ");
int st = Integer.parseInt(split[0]);
int end = Integer.parseInt(split[1]);
System.out.println(s[end] - s[st - 1]);
}
}
}