Universal Cup Judging System

Universal Cup

Límite de tiempo: 1 s Límite de memoria: 1024 MB
Estadísticas

Este es un problema interactivo.

VegiCat conoce un arreglo $a_1, a_2, \ldots, a_n$, donde cada elemento es $0$, $1$ o $2$. No quiere decirte sus valores, pero puedes hacerle preguntas. En cada consulta, eliges dos índices $i$ y $j$, y VegiCat te dice si $a_i > a_j$.

VegiCat te pide que imprimas los índices en orden no decreciente según los valores correspondientes del arreglo. Es decir, encuentra una permutación $p_1, p_2, \ldots, p_n$ de $1, 2, \ldots, n$ tal que

$$a_{p_1} \le a_{p_2} \le \cdots \le a_{p_n}.$$

problem_23599_9dab41a0c2d5e6c302cb4f2ad9a16799.png

Puedes realizar a lo sumo $2n - 3$ consultas en cada caso de prueba.

El interactor es adaptativo. Esto significa que el arreglo no está fijado de antemano. El interactor garantiza que siempre existe al menos un arreglo con elementos en $\{0, 1, 2\}$ consistente con todas las respuestas dadas hasta el momento. Tu permutación final debe ser válida para todo arreglo consistente con todas las respuestas.

Entrada

La primera línea contiene un entero $T$ ($1 \le T \le 250$), el número de casos de prueba. A continuación sigue la descripción de los casos de prueba.

Cada caso de prueba comienza con un entero $n$ ($2 \le n \le 500$), la longitud del arreglo.

La suma de $n$ en todos los casos de prueba no supera $500$.

Interacción

Para hacer una consulta, imprime una línea con el siguiente formato:

? i j

Aquí, $1 \le i, j \le n$. Después de cada consulta, lee un entero:

  • $1$, si $a_i > a_j$;
  • $0$, si $a_i \le a_j$.

Se permiten consultas con $i = j$ y consultas repetidas, y ambas se incluyen en el conteo de consultas.

Cuando hayas determinado el orden, imprime una línea con el siguiente formato:

! p_1 p_2 ... p_n

Cada índice de $1$ a $n$ debe aparecer exactamente una vez. Imprimir la respuesta no cuenta como una consulta.

Si tu respuesta es correcta, pasa al siguiente caso de prueba leyendo su $n$, o termina tu programa si este era el último caso de prueba. El interactor no envía una confirmación por separado después de una respuesta.

Después de imprimir cada consulta o respuesta, imprime un salto de línea y vacía el búfer de salida (flush). Para vaciar la salida, puedes usar:

  • fflush(stdout) o cout.flush() en C/C++;
  • System.out.flush() en Java y Kotlin;
  • sys.stdout.flush() en Python.

Si realizas una consulta inválida, excedes el límite de consultas o imprimes una respuesta incorrecta, recibirás un veredicto de Wrong Answer. Una salida que no siga el formato especificado también será juzgada como Wrong Answer. En estos casos, el interactor termina sin enviar una respuesta de error.

Ejemplos

Entrada 1

2
3

1

1

2

0

Salida 1


? 1 2

? 2 3

! 3 2 1

? 1 2

! 1 2

Nota

En el primer caso de prueba, las consultas ? 1 2 y ? 2 3 devuelven ambas $1$, por lo que $a_1 > a_2 > a_3$. Por lo tanto, $(3, 2, 1)$ es una respuesta correcta.

En el segundo caso de prueba, la consulta ? 1 2 devuelve $0$, por lo que $a_1 \le a_2$. Por lo tanto, $(1, 2)$ es una respuesta correcta.

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.