Cho dãy a1,a2,…,aN. Với một đoạn [l,r], chi phí của đoạn là số cặp chỉ số (i,j) thỏa l≤i<j≤r và ai=aj. Mỗi cặp chỉ được đếm một lần.
Hãy chia dãy thành đúng K đoạn liên tiếp không rỗng sao cho tổng chi phí của các đoạn nhỏ nhất.
Input
Dòng đầu gồm NK.
Dòng thứ hai gồm a1,a2,…,aN.
Output
In tổng chi phí nhỏ nhất.
Constraints
2≤N≤105.
2≤K≤min(N,20).
1≤ai≤N.
Kết quả dùng số nguyên 64 bit.
Scoring
Subtask 1 (50%): N≤70.
Subtask 2 (50%): không có ràng buộc thêm.
Example
Test 1
Input
7 3
1 1 3 3 3 2 1
Output
1
Giải thích: Chia dãy thành ba đoạn mang các giá trị [1], [1,3,3] và [3,2,1]. Chỉ đoạn giữa có một cặp phần tử bằng nhau, là cặp 3, nên tổng chi phí bằng 1.
Lời giải tóm tắt
Ý tưởng: Nếu một giá trị xuất hiện f lần trong đoạn, nó đóng góp f(f-1)/2. Duy trì cửa sổ [L,R], bảng tần suất và cost: khi thêm giá trị x, cộng số lần x hiện có rồi tăng tần suất; khi xóa, giảm tần suất trước rồi trừ tần suất mới.
Ý tưởng: Đặt dp[g][r] là chi phí nhỏ nhất cho r phần tử đầu với g đoạn. Đoạn cuối [p+1,r] cho recurrence min(dp[g-1][p]+cost(p+1,r)). Hàm số cặp bằng nhau là Monge (xét riêng từng giá trị), nên điểm chia tối ưu không giảm theo r; tính mỗi hàng bằng Divide and Conquer optimization và lấy cost qua cửa sổ động.
Ý tưởng: Các cập nhật thêm/xóa bảo toàn đúng số cặp; recurrence xét mọi đoạn cuối; tính Monge bảo đảm D&C không bỏ nghiệm. Độ phức tạp O(KN log N), bộ nhớ O(N).