canuc80k7902·3/15

Nhịp Giá

Nộp bài trên LQDOJ

Bài 79 · Slope Trick

Có ngày với giá . Mỗi ngày có thể mua nhiều nhất một cổ phiếu, bán nhiều nhất một cổ phiếu đang giữ hoặc không làm gì; không bán khống và cuối cùng không giữ cổ phiếu. Hãy tối đa hóa lợi nhuận.

Input

  • Dòng đầu chứa .
  • Dòng tiếp theo chứa .

Output

  • In lợi nhuận lớn nhất.

Constraints

  • .
  • .
  • Các trường hợp ngữ nghĩa quan trọng:
    • : Giá giảm liên tục. Không giao dịch và lợi nhuận bằng .
    • : Có nhiều đợt tăng xen kẽ. Có thể giữ nhiều cổ phiếu và đóng nhiều giao dịch.
    • : Giá bằng nhau. Giao dịch không tạo lợi nhuận.
    • : Giá chạm cận trên. Tổng lợi nhuận cần kiểu bit.

Scoring

  • Subtask ( điểm): test đầu có kích thước nhỏ, phù hợp với lời giải vét cạn mô tả trong tài liệu.
  • Subtask ( điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

6
5 1 4 2 7 3

Output

8

Giải thích: Mua ở giá và rồi bán lần lượt ở giá và cho lợi nhuận . Không giao dịch nào khác làm tổng lớn hơn.

Lời giải tóm tắt
  • Phân tích: Min-heap lưu các giá mua biên của DP theo số cổ phiếu. Khi giá hiện tại lớn hơn giá nhỏ nhất q, đóng một giao dịch lời p-q và đưa p trở lại heap để bảo toàn khả năng phản hối. Đây là biểu diễn hàm lồi/lõm theo breakpoint thay vì lưu mọi giá trị trạng thái.
  • Thuật toán: Thực hiện đúng phép cập nhật nêu trên theo thứ tự dữ liệu vào. Mọi tổng chi phí hoặc lợi nhuận dùng số nguyên 64 bit.
  • Chứng minh: Invariant của cấu trúc dữ liệu trùng với sai phân của hàm quy hoạch động sau mỗi phần tử. Mỗi thao tác chỉ thay đổi đúng các breakpoint bị tác động và cập nhật phần hằng bằng đúng mức tăng hoặc giảm của cực trị. Quy nạp theo số phần tử cho thấy trạng thái cuối biểu diễn đúng toàn bộ phương án hợp lệ, nên giá trị in ra là tối ưu.
  • Độ phức tạp: Thời gian O(N log N), bộ nhớ O(N).