Hướng dẫn cho HackDream Green 04-E: Ba thao tác trên dãy nhị phân
Chỉ sử dụng khi thực sự cần thiết như một cách tôn trọng tác giả và người viết hướng dẫn này.
Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.
Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.
Subtask 1:
Với mỗi truy vấn ~1~ và ~2~, thực hiện thay đổi dãy theo yêu cầu đề bài với một vòng lặp.
Với mỗi truy vấn ~3~, ỉn ra đúng giá trị của phần tử ở vị trí ~x~.
Độ phức tạp: ~O(n^2)~.
Subtask 2:
Ta nhận thấy rằng, cứ mỗi 2 lần đảo vị trí hoặc đảo giá trị của các phần tử trong dãy, dãy sẽ trở lại vị trí ban đầu.
Thay vì trực tiếp sửa lại dãy sau mỗi lần truy vấn, ta lưu lại 2 biến ~q1~ và ~q2~ là số lần đã thực hiện 2 truy vấn ~1~ và ~2~ tương ứng. Mỗi khi có truy vấn ~1~ và ~2~, thay vì mất một vòng lặp ~O(n)~ để thao tác, ta chỉ cần tăng ~q1~ và ~q2~ tương ứng mất ~O(1)~.
Với mỗi truy vấn ~3~, thực hiện tìm ra giá trị đúng theo 2 bước:
- Tìm vị trí: Nếu số lần đảo vị trí là chẵn, in ra giá trị tại vị trí ~x~, ngược lại in ra giá trị của phần tử ở vị trí đối xứng với ~x~ trong dãy là ~n-x+1~.
- Tìm giá trị: Nếu số lần đảo giá trị là chẵn, in ra giá trị tại vị trí đó (bị ảnh hưởng bởi phép đảo vị trí), ngược lại in ra giá trị đảo ngược của nó.
Độ phức tạp: ~O(n)~.
Bình luận