Hướng dẫn cho HackDream Purple 05-D: Làm bánh


Chỉ sử dụng khi thực sự cần thiết như một cách tôn trọng tác giả và người viết hướng dẫn này.

Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.

Subtask 1, 2

Ta sử dụng quy hoạch động cho từng truy vấn: ~dp(i, num)~ là tổng của tích của các phần tử trong các tập con có ~num~ phần tử. Công thức: ~dp(i, num) = dp(i-1,num) + dp(i-1,num-1) \times a_i~.

Độ phức tạp thuật toán: ~O(n \times k)~.

Thuật toán chuẩn

Ta sử dụng kĩ thuật giải quyết truy vấn tĩnh bằng chia để trị cùng với quy hoạch động để giải quyết bài toán này.

Xét đoạn ~[L,R]~, ta trả lời các truy vấn ~l~ ~r~ ~k~ mà ~L \le l \le mid=\frac{l+r}{2} < r \le R~.

Gọi ~dpL(i, num)~ là tổng của tích của các phần tử trong các tập con có ~num~ phần tử của đoạn ~[i, mid]~, tương tự với ~dpR(j, num)~ của đoạn ~[mid+1,j]~.

Kết quả cho truy vấn này là ~\prod dpL(l, k') \times dpR(r, k - k')~.

Độ phức tạp thuật toán: ~O(n\space log\space n \times k+q(log\space n+k))~.


Bình luận

Không có bình luận nào.