题目描述
对于给定的长度为 n 的数组 {a1, a2, ..., an},我们有 m 次查询操作。每一次操作给出两个参数 l, r,你需要输出数组中第 l 到第 r 个元素之和,即 al + al+1 + ... + ar。
输入描述: 第一行输入两个整数 n, m (1 ≤ n, m ≤ 10^5),代表数组中的元素数量、查询次数。 第二行输入 n 个整数 a1, a2, ..., an (-10^9 ≤ ai ≤ 10^9),代表初始数组。 此后 m 行,每行输入两个整数 l, r (1 ≤ l ≤ r ≤ n),代表一次查询。
输出描述: 对于每一次查询操作,在一行上输出一个整数,代表区间和。
示例 输入: 3 2 1 2 4 1 2 2 3 输出: 3 6
算法原理
前缀和是一种常用的动态规划思想,用于快速计算区间和。 核心公式:dp[i] = dp[i - 1] + arr[i] 其中 dp[i] 表示前 i 个元素的和。 区间 [l, r] 的和可以通过 dp[r] - dp[l - 1] 快速得出。 这种方法将单次查询的时间复杂度从 O(n) 优化为 O(1),总时间复杂度为 O(n + m)。
提交代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int[] array = new int[n + 1];
for (int i = 1; i <= n; i++) {
array[i] = in.nextInt();
}
// 所有前缀和累积算出
long[] dp = new long[n + 1];
for (int i ; i <= n; i++) {
dp[i] = dp[i - ] + array[i];
}
(m > ) {
in.nextInt();
in.nextInt();
System.out.println(dp[r] - dp[l - ]);
m--;
}
}
}


