Universal Cup Judging System

Universal Cup

Time Limit: 3.0 s Memory Limit: 1024 MB Total points: 100 Difficulty: [show] Interactive Hackable ✓
Statistics

Спасибо за твой нелёгкий труд, дорогой друг. Little Cyan Fish не знает, сколько его зашифрованных слов удастся передать, но всё равно благодарит тебя за то, что ты дошёл до этой точки вместе с Little Cyan Fish. Произошло так много всего, так много нелепых вещей, Little Cyan Fish устал, очень устал... За прошедший год Little Cyan Fish несколько раз чувствовал, что вот-вот спасёт себя сам, но, в конце концов, он оказался недостаточно силён, чтобы перерезать нити на своём теле. Little Cyan Fish всегда представляет, что в том далёком месте есть другой он сам, который может ясно видеть карту его жизни.

— «Стремление вдаль» · Финал 10-го Китайского студенческого чемпионата по программированию

Это интерактивная задача.

Что ж, возможно, вы можете попробовать и узнать, насколько это будет сложно. Little Cyan Fish чувствует, что его жизнь — это перестановка неизвестной формы. Люди всегда говорят, что мир полон случайностей, но почему Little Cyan Fish всегда так не везёт?.. Ага! Быть может, случайность просто настолько глубока! Поэтому Little Cyan Fish решает, что эта его перестановка будет случайно сгенерирована следующим образом:

  • Сгенерировать случайную перестановку $p_1, p_2, \dots, p_n$: она выбирается равновероятно из всех $n!$ возможных перестановок чисел от $1$ до $n$.
  • Если $p_1 > p_n$, то развернуть всю перестановку задом наперёд.

Вы не можете напрямую наблюдать структуру перестановки, но Little Cyan Fish даровал вам суперспособность: задавать вопросы! Каждый раз вы можете интерактивно запросить значение расстояния между двумя числами в перестановке по модулю $3$. А именно, каждый раз вы можете выбрать два числа $u, v$ ($1 \le u, v \le n$, $u \ne v$), и перестановка сообщит вам значение расстояния между этими двумя числами по модулю $3$ (то есть, найдя два индекса $i, j$, удовлетворяющих $p_i = u, p_j = v$, перестановка ответит $|i - j| \bmod 3$).

Теперь Little Cyan Fish хочет, чтобы вы попробовали и посмотрели, что у вас получится. Вам нужно помочь Little Cyan Fish определить эту перестановку не более чем за $25n$ запросов.

Входные данные

Входные данные состоят из нескольких наборов входных данных. Первая строка входных данных содержит одно целое число $T$ ($1 \le T \le 1000$), обозначающее количество наборов входных данных.

В каждом наборе входных данных сначала вам нужно считать одно целое число $n$ ($3 \le n \le 10^4$).

Протокол взаимодействия

Далее начинается взаимодействие. В каждом наборе входных данных вы можете сделать не более $25n$ запросов. Чтобы сделать запрос, вам нужно вывести одну строку ? u v ($1 \le u, v \le n$, $u \ne v$), описывающую запрос. Затем вам нужно считать результат из стандартного потока ввода.

Чтобы дать ответ, вам нужно вывести ! p1 p2 ... pn. Ваш вывод должен удовлетворять условию $p_1 < p_n$. Вывод ответа не учитывается в ограничении в $25n$ запросов. После вывода ответа вам нужно немедленно перейти к чтению следующего набора входных данных или немедленно завершить программу.

После вывода запроса не забудьте вывести символ перевода строки и сбросить буфер вывода (flush). Для этого вы можете использовать fflush(stdout) или cout.flush() в C++, System.out.flush() в Java, flush(output) в Pascal и stdout.flush() в Python.

Гарантируется, что сумма $n$ по всем наборам входных данных не превышает $10^4$.

В этой задаче гарантируется, что интерактор неадаптивен. То есть перестановки определяются случайным образом, как указано в условии задачи, до начала процесса взаимодействия. Они не изменяются в зависимости от ваших запросов. Всего имеется $30$ тестов (включая тест из примера).

Пример

Входные данные 1

2
3
2
1
1
4
1
1
1
0
2

Выходные данные 1

? 1 2
? 2 3
? 1 3
! 1 3 2
? 2 3
? 3 1
? 1 4
? 2 4
? 2 1
! 2 3 1 4

Примечание

problem_18002_1.png

Рисунок 1: Little Cyan Fish и <?> в <?>, снято 4 марта 2026 года

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.