canuc80k4207·8/30

Chia Bản Thảo

Nộp bài trên LQDOJ

Bài 4.3 · Convex Hull Trick

Cho một dãy số không âm và hằng số . Bạn phải chia dãy thành các đoạn liên tiếp không rỗng.

Nếu tổng phần tử của một đoạn là , chi phí của đoạn bằng . Hãy tìm tổng chi phí nhỏ nhất. Input có thể chứa nhiều bộ dữ liệu liên tiếp cho đến hết tệp.

Input

  • Mỗi bộ dữ liệu bắt đầu bằng .
  • Dòng tiếp theo chứa phần tử của dãy.
  • Các bộ dữ liệu xuất hiện liên tiếp cho đến EOF.

Output

  • Với mỗi bộ dữ liệu, in đáp án trên một dòng.

Constraints

  • cho mỗi bộ.
  • .
  • .
  • Mọi đáp án nằm trong miền số nguyên có dấu -bit.

Scoring

  • Subtask ( số điểm): kích thước chính không vượt quá .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

4 2
1 2 1 3

Output

23

Giải thích: Chia thành bốn đoạn đơn [1], [2], [1], [3] cho chi phí . Mọi cách ghép hai hay nhiều phần tử trong ví dụ đều cho tổng lớn hơn.

Lời giải tóm tắt
  • Phân tích: Chia mỗi dãy thành các đoạn để tối thiểu hóa bình phương tổng đoạn cộng phí cố định.
  • Thuật toán: Dùng prefix sum S. Chuyển tiếp dp[i]=min_j(dp[j]+(S[i]-S[j])²+m) được khai triển thành truy vấn đường slope -2S[j], intercept dp[j]+S[j]².
  • Chứng minh: Mỗi cách chia có một vị trí kết thúc đoạn áp chót j; giá trị đường của j tại S[i] cộng phần cố định bằng đúng chi phí. Cực tiểu cho recurrence.
  • Độ phức tạp: Mỗi bộ O(n log n) thời gian, O(n) bộ nhớ.