Hướng dẫn giải của Nhân viên cứu hộ (Platinum)
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Lời giải: Nhân viên cứu hộ (Platinum)
Hướng tiếp cận
Bài toán yêu cầu sa thải đúng trong nhân viên sao cho tổng độ dài phần bao phủ của các đoạn còn lại là lớn nhất. Đây là bài toán quy hoạch động trên các đoạn thời gian.
Nhận xét quan trọng
Loại bỏ đoạn bị chứa: Nếu đoạn được chứa hoàn toàn trong đoạn (tức là và ), thì xóa không làm mất bao phủ nào. Gọi số đoạn bị chứa là
free_removals. Ta dùng chúng ưu tiên để đạtKlần sa thải.Sau khi lọc: Sắp xếp theo thời điểm bắt đầu và loại bỏ các đoạn bị chứa, tập còn lại có tính chất đơn điệu: cả điểm đầu lẫn điểm cuối đều tăng nghiêm ngặt.
Giảm bài toán: Sau khi dùng hết
free_removalslần sa thải miễn phí, cần sa thải thêmneed = K - free_removalsđoạn từ tập .
Thuật toán
Quy hoạch động:
Định nghĩa = bao phủ tối đa của khi giữ và sa thải đúng đoạn từ .
Chuyển trạng thái: Với mỗi (đoạn liền trước được giữ):
- Loại bỏ tất cả (gồm đoạn), nên .
- Đóng góp của :
- Nếu và rời nhau ():
- Nếu chồng lấp: (vì đơn điệu, )
- Ta chỉ cần xét (vì ).
Trường hợp cơ sở: với (sa thải tất cả ).
Kết quả: , trong đó ta cũng sa thải đoạn .
Độ phức tạp
- Thời gian: với , .
- Trong thực tế, trong các test của USACO, nên phần DP là rất nhanh.
- Bộ nhớ:
Bình luận