Hướng dẫn giải của Mofk Cup Round 1 - ROBOT


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
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ả: bedao

Subtask 1
  • ~N \le 1000~

Ở subtask này ta có thể thử chèn lần lượt các lệnh L, R, U, D ở từng vị trí sau đó duyệt lại chuỗi mới từ đầu.

Kết hợp với cấu trúc dữ liệu như std :: map hoặc std :: set sẽ cho ta độ phức tạp ~O(N^2logN)~.

Subtask 2
  • ~N \le 2 \times 10^5~

Đầu tiên ta lưu lại thứ tự tọa độ thăm của robot khi thực hiện dãy lệnh ban đầu.

Gọi ~\text{move_x[c]}~ và ~\text{move_y[c]}~ lần lượt là lượng dịch của hoành độ và tung độ khi ta thực hiện lệnh ~c~.

Khi ta thêm một lệnh ~c~ vào sau vị trí ~i~ thì mọi vị trí ~\text{pos[j] = (x, y)}, i < j \le n~ mà robot đã đi qua sau lệnh thứ ~i~ sẽ thay đổi thành ~\text{pos[j] = (x + move_x[c], y + move_y[c])}~.

Nhận xét, khi ta đã thử thêm một lệnh ~c~ ở vị trí ~i~, sau đó ta lại thử lệnh ~c~ ở vị trí ~i + 1~ thì sự khác nhau giữa hai lần này chỉ có ở vị trí ~pos[i + 1]~, ở lần thêm sau thì vị trí này vẫn giữ nguyên.

Do đó nếu đang xét riêng việc thêm lệnh ~c~, thì ta có thể duyệt ngược từ cuối về để vừa có thể dịch phần hậu tố theo lệnh vừa thêm.

Độ phức tạp ~O(NlogN)~


Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.