Hướng dẫn giải của Tuyệt chiêu


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.

Subtask 1 : ~n \leq 10^3~

- Ta sẽ duyệt qua từng cặp phần tử trong dãy số. Với mỗi cặp gồm hai phần tử giống nhau, ta sẽ kiểm tra xem tuyệt chiêu đó có được sử dụng đúng quy định hay không.

- Nếu tuyệt chiêu được sử dụng sai quy định thì ta sẽ cập nhật lại biến ~min~, là mã số của tuyệt chiêu vi phạm có mã nhỏ nhất.

- Vì ta duyệt qua từng cặp phần tử trong mảng nên độ phức tạp thuật toán là ~O(n ^ 2)~.

Độ phức tạp: ~O(n ^ 2)~.

Subtask 2 : ~n \leq 10^6~

- Đầu tiên, ta đưa ra nhận xét là với một lần sử dụng tuyệt chiêu có mã là ~x~, ta không cần phải kiểm tra nó với mọi lần sử dụng của ~x~, mà ta chỉ cần so sánh với lần sử dụng tuyệt chiêu ngay trước nó.

- Để ý thấy rằng, giá trị của ~a_i \leq 10^6~, vậy nên ta có thể duy trì một mảng ~last~ lưu lại lần sử dụng gần nhất của tuyệt chiêu ~x~.

- Thay vì phải duyệt qua từng cặp phần tử như subtask ~1~, ta chỉ cần duyệt xét phần tử thứ ~i~ với phần tử ~last~ nên độ phức tạp thuật toán của ta sẽ là ~O(n)~

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


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.