canuc80k0232·33/50

Đoạn Có Tổng Lớn Nhất

Nộp bài trên LQDOJ

Bài 02 · Prefix Sum

Cho dãy gồm số nguyên. Một đoạn con được tạo bởi các phần tử liên tiếp , với ; vì vậy đoạn luôn chứa ít nhất một phần tử.

Hãy tìm tổng lớn nhất có thể đạt được bởi một đoạn con của dãy.

Input

  • Dòng đầu chứa số nguyên .
  • Dòng thứ hai chứa số nguyên .

Output

  • In một số nguyên - tổng đoạn con lớn nhất.

Constraints

  • .
  • .
  • Đáp án nằm trong phạm vi số nguyên bit có dấu.

Scoring

  • Subtask ( số điểm): .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

8
-5 4 -1 2 1 -7 6 3

Output

9

Giải thích: Đoạn từ vị trí đến có tổng . Mọi đoạn kết thúc trước đó đạt nhiều nhất , nên là tổng lớn nhất.

Lời giải tóm tắt
  • Ý tưởng: Đặt P[0]=0 và P[i]=X_1+...+X_i. Tổng đoạn [l,r] bằng P[r]-P[l-1]. Với đầu phải r cố định, tổng lớn nhất đạt được khi trừ đi prefix nhỏ nhất trong P[0..r-1].
  • Ý tưởng: Duy trì minPrefix của các prefix đứng trước vị trí hiện tại. Sau khi cộng X_r vào prefix, dùng prefix-minPrefix cập nhật đáp án, rồi mới đưa prefix hiện tại vào minimum. Trình tự này không cho phép đoạn rỗng.
  • Chứng minh tính đúng: Mọi đoạn không rỗng kết thúc tại r có một đầu trái tương ứng với đúng một prefix P[l-1] đứng trước P[r]. Chọn prefix nhỏ nhất cho giá trị lớn nhất trong tất cả các đoạn kết thúc tại r; biến minPrefix lưu đúng giá trị đó. Thuật toán lấy maximum của ứng viên tốt nhất cho mọi r, nên bao phủ toàn bộ đoạn hợp lệ và trả về tối ưu toàn cục, kể cả khi mọi số âm.
  • Độ phức tạp: Thời gian O(N), bộ nhớ phụ O(1), mọi tổng dùng long long.