Hướng dẫn giải của Mofk Cup Round 1 - PAPER
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.
Tác giả:
Ta sẽ sử dụng thuật toán sweep Line để giải bài này.
Với mỗi ~y~ từ ~1~ đến ~10^6~, ta sẽ cần tìm phần diện tích bị bao phủ bởi đúng ~k~ tờ giấy nằm ở độ cao ~y~. Xét những tờ giấy có tung độ ~\geq y~, ta sẽ sắp xếp chúng theo ~x~ không giảm và dễ dàng nhận ra diện tích bao phủ chính là phần được giao bởi tờ giấy thứ ~k~ và ~k+1~.
Để tìm được diện tích đó, ta có thể sử dụng cấu trúc dữ liệu std::multi_set và std::priority_queue để duy trì những tờ giấy có tung độ ~\geq y~. Ở đây ta duy trì ~1~ multi_set gồm ~k~ tọa độ có ~x~ lớn nhất, ~1~ priority_queue lưu những tọa độ còn lại. Khi đi lên ~y+1~, ta sẽ xóa những tờ giấy có tung độ là ~y~ trong multi_set và sẽ thêm những tọa độ mới từ priority_queue vào multi_set.
Ngoài ra ta có thể sử dụng cấu trúc dữ liệu Fenwick Tree kết hợp Two Pointer thay thế cho 2 cấu trúc dữ liệu trên với hằng số nhỏ hơn, tối ưu thời gian chạy.

Bình luận