Prefix Sum Array

Xem PDF



Tác giả:
Dạng bài
Ngôn ngữ cho phép
Assembly, Awk, C, C#, C++, Clang, Cobol, D, Groovy, Haskell, JS, Java, Kotlin, Lua, Node JS, OCaml, ObjectiveC, Output, PHP, Pascal, Perl, Prolog, Pypy, Pypy 3, Python, Ruby, Rust, Scala, Scratch, Swift
Điểm: 400 Thời gian: 1.0s Bộ nhớ: 640M Input: bàn phím Output: màn hình

Cho một mảng \(A[]\)\(n\) phần tử được đánh số từ \(1\) đến \(N\).
Gọi mảng cộng dồn \(S[]\) của mảng \(A[]\) là một mảng mà \(S[i] = A[1] + A[2] + \dots + A[i]\).

Ví dụ:
Ta có mảng \(A = \{1, 3, 5, -4, 9\}\)
Thì ta sẽ có mảng \(S = \{1, 4, 9, 5, 14\}\)

Giải thích ví dụ:

  • \(S[1] = A[1] = 1\)
  • \(S[2] = A[1] + A[2] = 1 + 3 = 4\)
  • \(S[3] = A[1] + A[2] + A[3] = 1 + 3 + 5 = 9\)
  • \(S[4] = A[1] + A[2] + A[3] + A[4] = 1 + 3 + 5 + (-4) = 5\)
  • \(S[5] = A[1] + A[2] + A[3] + A[4] + A[5] = 1 + 3 + 5 + (-4) + 9 = 14\)

Xây dựng mảng cộng dồn:
Ta có nhận xét như sau:

  • \(S[i - 1] = A[1] + A[2] + \dots + A[i - 1]\)
  • \(S[i] = A[1] + A[2] + \dots + A[i - 1] + A[i]\)
    \(\Rightarrow S[i] = S[i - 1] + A[i]\)

Vậy muốn xây dựng mảng cộng dồn \(S[]\) từ mảng \(A[]\) chúng ta sẽ thực hiện những bước sau:

  • Bước 1: Tạo mảng \(A\) và mảng \(S\).
  • Bước 2: Đặt \(S[0] = 0\).
  • Bước 3: Cho \(i\) chạy từ \(1\) đến \(n\), chúng ta sẽ dễ dàng có \(S[i] = S[i - 1] + A[i]\).

Ứng dụng của mảng cộng dồn:
Ta có nhận xét như sau:
Đặt \(l, r\)\(2\) số tự nhiên sao cho \(1 \le l \le r \le\) độ dài mảng \(A\).

  • \(S[l] = A[1] + \dots + A[l]\)
  • \(S[r] = A[1] + \dots + A[r]\)
    \(\Rightarrow S[r] - S[l - 1] = A[l] + \dots + A[r]\)
    Vậy chúng ta có thể tính tổng một đoạn con liên tiếp từ \(l\) đến \(r\) của mảng \(A\) trong \(O(1)\).

Input

  • Dòng 1: Một số nguyên \(N\) là độ dài của mảng \(A[]\) (\(1 \le N \le 10^7\)).
  • Dòng 2: Gồm \(N\) số nguyên \(A[1], A[2], \dots, A[N]\) (\(-10^9 \le A[i] \le 10^9\)).

Output

  • Các phần tử từ \(1\) đến \(N\) của mảng \(S[]\) được in ra trên một dòng, cách nhau bởi dấu cách.

Example

Test 1

Input
5
1 3 5 -4 9
Output
1 4 9 5 14

Bình luận

Mới nhất
Tải bình luận...

Không có bình luận nào.