B3612 【深进1.例1】求区间和

5 阅读2分钟

B3612 【深进1.例1】求区间和

题目描述

给定 nn 个正整数组成的数列 a1,a2,,ana_1, a_2, \cdots, a_nmm 个区间 [li,ri][l_i,r_i],分别求这 mm 个区间的区间和。

输入格式

第一行,为一个正整数 nn

第二行,为 nn 个正整数 a1,a2,,ana_1,a_2, \cdots ,a_n

第三行,为一个正整数 mm

接下来 mm 行,每行为两个正整数 li,ril_i,r_i ,满足 1lirin1\le l_i\le r_i\le n

输出格式

mm 行。

ii 行为第 ii 组答案的询问。

输入输出样例 #1

输入 #1

4
4 3 2 1
2
1 4
2 3

输出 #1

10
5

说明/提示

样例解释:第 1 到第 4 个数加起来和为 10。第 2 个数到第 3 个数加起来和为 5。

对于 50%50\% 的数据:n,m1000n,m\le 1000

对于 100%100\% 的数据:1n,m1051 \leq n,m\le 10^51ai1041 \leq a_i\le 10^4

思路

使用前缀和来高效计算区间和。前缀和是一种预处理技术,通过预先计算数组的前缀和,可以在 O(1)O(1) 的时间内查询任意区间的和。

具体步骤如下:

  1. 计算前缀和数组

    • 定义数组 sum,其中 sum[i] 表示数组 aa 的前 ii 个元素的和。
    • 递推公式:sum[i] = sum[i-1] + a[i-1]
  2. 查询区间和

    • 对于每个查询 [li,ri][li​,ri​],区间和可以通过前缀和数组快速计算:区间和=sum[ri]−sum[li−1]区间和=sum[ri​]−sum[li​−1]

代码实现

java
复制代码
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // 读取数组长度 n
        int n = sc.nextInt();

        // 读取数组 a
        int[] a = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = sc.nextInt();
        }

        // 计算前缀和数组 sum
        long[] sum = new long[n + 1];
        for (int i = 1; i <= n; i++) {
            sum[i] = sum[i - 1] + a[i - 1];
        }

        // 读取查询数量 m
        int m = sc.nextInt();

        // 处理每个查询
        long[] res = new long[m];
        for (int i = 0; i < m; i++) {
            int l = sc.nextInt();
            int r = sc.nextInt();
            res[i] = sum[r] - sum[l - 1];
        }

        // 输出结果
        for (long s : res) {
            System.out.println(s);
        }
    }
}

显示更多

代码解释

  1. 输入处理

    • 读取数组长度 nn。
    • 读取数组 aa 并存储。
    • 计算前缀和数组 sum,其中 sum[i] 表示数组 aa 的前 ii 个元素的和。
  2. 查询处理

    • 读取查询数量 mm。
    • 对于每个查询 [li,ri][li​,ri​],通过前缀和数组快速计算区间和,并存储结果。
  3. 输出结果

    • 遍历结果数组 res,输出每个查询的结果。

复杂度分析

  • 时间复杂度

    • 计算前缀和数组:O(n)O(n)。
    • 处理 mm 个查询:O(m)O(m)。
    • 总时间复杂度:O(n+m)O(n+m)。
  • 空间复杂度

    • 前缀和数组 sum 占用 O(n)O(n) 空间。
    • 结果数组 res 占用 O(m)O(m) 空间。
    • 总空间复杂度:O(n+m)O(n+m)。