Cho dãy X gồm N số nguyên. Một đoạn con được tạo bởi các phần tử liên tiếp Xl,Xl+1,…,Xr, với 1≤l≤r≤N; 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 N.
Dòng thứ hai chứa N số nguyên X1,X2,…,XN.
Output
In một số nguyên - tổng đoạn con lớn nhất.
Constraints
1≤N≤2⋅105.
−109≤Xi≤109.
Đáp án nằm trong phạm vi số nguyên 64 bit có dấu.
Scoring
Subtask 1 (50% số điểm): N≤2000.
Subtask 2 (50% 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í 7 đến 8 có tổng 6+3=9. Mọi đoạn kết thúc trước đó đạt nhiều nhất 6, nên 9 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.