2020/9/30 Acwing-字首和

lsw518598發表於2020-09-30

題目

輸入一個長度為n的整數序列。
接下來再輸入m個詢問,每個詢問輸入一對l, r。
對於每個詢問,輸出原序列中從第l個數到第r個數的和。
輸入格式
第一行包含兩個整數n和m。
第二行包含n個整數,表示整數數列。
接下來m行,每行包含兩個整數l和r,表示一個詢問的區間範圍。
輸出格式
共m行,每行輸出一個詢問的結果。
資料範圍
1≤l≤r≤n,
1≤n,m≤100000,
−1000≤數列中元素的值≤1000
輸入樣例:
5 3
2 1 3 6 4
1 2
1 3
2 4
輸出樣例:
3
6
10

題目分析

使用字首和陣列,能夠更方便的得到原陣列部分連續的元素的和,優勢在於只有第一次儲存字首和陣列的時間複雜度是O(n),而求和時的複雜度都是O(1)

原始碼

import java.util.Scanner;
class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int m=sc.nextInt();
        //int[] q=new int[100000];
        int[] q_sum=new int[100100];
        for(int i=1;i<=n;i++){
         int x=sc.nextInt();
         q_sum[i]=q_sum[i-1]+x;
        }
        while(m-->0){
            int l=sc.nextInt();
            int r=sc.nextInt();
            System.out.println(q_sum[r]-q_sum[l-1]);
        }
        
    }
}

題目很簡單,我這裡可以看到並沒有儲存原陣列,而是直接把原陣列的元素經過計算,直接存入到字首和陣列中了.對於給出一個陣列,要求其字首和陣列,可採用的方式:

for(int i=1;i<=n;i++){
q_sum[i]=q_sum[i-1]+q[i];}

本題屬於簡單題,唯一值得注意的是,在儲存資料時,最好從角標1開始存,這樣角標為0的數就是0.字首和陣列也是從0開始存.這樣做的好處是,字首和陣列的第一項是原陣列的第0項(即0)+第一項,這樣初始條件就沒有問題了. (如果從0開始存,那字首和的第0項需要自己寫值,因為原陣列沒有-1項)