Editorial for VQ15 Cỗ bài

Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.


Submitting an official solution before solving the problem yourself is a bannable offence.

Nhận xét: Nếu bài toán có lời giải với yêu cầu hạ các quân bài tạo thành dãy ~1, 2, . . ., x~ thì cũng có lời giải khi yêu cầu hạ các quân bài tạo thành dãy ~1, 2, . . ., y~ với ~y < x~ vì vậy có thể tìm ~max(x)~ theo giải thuật tìm kiếm nhị phân trong khoảng ~[0, m]~.

Từ nhận xét trên ta có giải thuật xử lý cho mỗi bộ dữ liệu như sau:

  • B1. Nhập dữ liệu,

  • B2. Tìm ~max(x)~ theo giải thuật tìm kiếm nhị phân trong khoảng ~ [0, m]~,

  • B3. Đưa ra ~max~ tìm được.

Trọng tâm của giải thuật là hàm ~check(u)~ kiểm tra xem có thể hạ bài tạo thành dãy ~1, 2, . . ., u~. Để tiện xử lý ta sẽ ghi số các số trên quân bài bắt đầu từ ~0~. Như vậy khoảng cần xét sẽ là ~[0, m-1]~, các giá trị ai sẽ giảm ~1~ trong lưu trữ.

Giải thuật kiểm tra với giá trị ~u~:

  • Quân bài có số ghi ~x~ ~(x \leq u)~ chưa có thể hạ xuống được gọi là quân bài chờ,

  • Ban đầu số ở các quân bài chờ là ~u, u-1, . . ., u – max(k-1, 0)~,

  • Duyệt các quân bài từ ~n~ lùi về ~1~, nếu gặp quân bài chờ thì xóa dấu hiệu chờ của quân bài đó và bổ sung thêm quân bài chờ mới là ~p-1~, trong đó ~p~ – quân bài chờ hiện tại nhỏ nhất.

  • Số lượng bài chờ bằng ~0~ nghĩa là có thể hạ hết các quân bài theo yêu cầu, giá trị ~u~ có thể đạt được,

  • Trong trường hợp ngược lại, khi duyệt hết cỗ bài mà vẫn còn quân chờ - không thể đạt tới giá trị ~u~.

Độ phức tạp của giải thuật: ~O((n+m)logm)~.


Comments

Please read the guidelines before commenting.


There are no comments at the moment.