| Codeforces Round 1068 (Div. 2) |
|---|
| Закончено |
Это интерактивная задача.
Однажды Сора и Широ скучали и решили развлечь себя с помощью игры.
В начале Сора дает Широ перестановку$$$^{\text{∗}}$$$ $$$p_1,p_2,\ldots,p_n$$$ длины $$$n$$$. В каждой операции Широ может выбрать два различных индекса $$$x$$$ и $$$y$$$ ($$$1\le x\ne y\le n$$$). Затем Сора подбрасывает честную монету:
После операции Сора сообщает фактическую пару индексов, которые были обменяны, чтобы Широ могла обновить свою локальную перестановку соответственно.
Цель Широ — отсортировать перестановку $$$p$$$ в порядке возрастания, используя не более $$$\lfloor 2.5n+800\rfloor$$$ операций. Помогите ей!
$$$^{\text{∗}}$$$Перестановкой длины $$$n$$$ является массив, состоящий из $$$n$$$ различных целых чисел от $$$1$$$ до $$$n$$$ в произвольном порядке. Например, $$$[2,3,1,5,4]$$$ — перестановка, но $$$[1,2,2]$$$ не перестановка ($$$2$$$ встречается в массиве дважды) и $$$[1,3,4]$$$ тоже не перестановка ($$$n=3$$$, но в массиве встречается $$$4$$$).
Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число $$$t$$$ ($$$1 \le t \le 100$$$) — количество наборов входных данных. Далее следует описание наборов входных данных.
Первая строка каждого набора входных данных содержит одно целое число $$$n$$$ ($$$1\le n\le 4000$$$) — длина $$$p$$$.
Вторая строка содержит $$$n$$$ целых чисел $$$p_1,p_2,\ldots,p_n$$$ — элементы $$$p$$$.
Гарантируется, что сумма значений $$$n$$$ по всем наборам входных данных не превосходит $$$2\cdot 10^4$$$.
Гарантируется, что в этой задаче $$$50$$$ тестов.
Для каждого набора входных данных вы можете использовать не более $$$\lfloor 2.5n+800\rfloor$$$ ходов, чтобы отсортировать перестановку $$$p$$$ в порядке возрастания.
Чтобы сделать ход, вы должны вывести новую строку в следующем формате:
В ответ на ход вы получите два целых числа $$$u$$$ и $$$v$$$ — фактическая пара индексов, которые Сора поменяла местами. Гарантируется, что $$$(u, v)$$$ случайным образом выбрано из $$$(x, y)$$$ и $$$(n-x+1, n-y+1)$$$ с равной вероятностью.
Чтобы сообщить, что перестановка отсортирована в порядке возрастания, вы должны вывести новую строку с единственным символом $$$\mathtt{!}$$$. Это не считается одним из $$$\lfloor 2.5n+800\rfloor$$$ ходов.
После этого переходите к следующему набору входных данных или завершите программу, если это был последний набор входных данных.
После вывода каждого запроса не забудьте вывести перевод строки и сбросить буфер вывода$$$^{\text{∗}}$$$. В противном случае вы получите вердикт Решение «зависло».
На любом шаге взаимодействия, если вы считали $$$-1$$$ вместо корректных данных, ваше решение должно немедленно завершиться. Это означает, что ваше решение получит вердикт Неправильный ответ из-за некорректного запроса или любой другой ошибки. Если программа не завершится, вы можете получить любой вердикт, так как ваша программа продолжит чтение из закрытого потока.
В этой задаче отключены взломы.
$$$^{\text{∗}}$$$Чтобы сбросить буфер вывода, используйте:
2 5 5 1 3 4 2 1 5 2 1 2 1 2
? 1 5 ? 4 5 ! !
В первом наборе входных данных $$$n=5$$$, и начальная перестановка $$$[5,1,3,4,2]$$$.
Во втором наборе входных данных данная перестановка уже возрастает, поэтому нам просто нужно вывести !.
| Название |
|---|


