Universal Cup Judging System

Universal Cup

Limite de temps : 1 s Limite de mémoire : 1024 MB
Statistiques

Dies ist ein interaktives Problem.

VegiCat kennt ein Array $a_1, a_2, \ldots, a_n$, in dem jedes Element den Wert $0$, $1$ oder $2$ hat. Er möchte dir die Werte nicht verraten, aber du kannst ihm Fragen stellen. In jeder Anfrage wählst du zwei Indizes $i$ und $j$, und VegiCat teilt dir mit, ob $a_i > a_j$ gilt.

VegiCat bittet dich, die Indizes in nichtabsteigender Reihenfolge der zugehörigen Arraywerte auszugeben. Das heißt, finde eine Permutation $p_1, p_2, \ldots, p_n$ von $1, 2, \ldots, n$, sodass

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

problem_23599_9dab41a0c2d5e6c302cb4f2ad9a16799.png

Du darfst in jedem Testfall höchstens $2n - 3$ Anfragen stellen.

Der Interaktor ist adaptiv. Das bedeutet, dass das Array nicht im Voraus festgelegt ist. Der Interaktor garantiert, dass es immer mindestens ein Array mit Elementen aus $\{0, 1, 2\}$ gibt, das mit allen bisher gegebenen Antworten konsistent ist. Deine endgültige Permutation muss für jedes mit allen Antworten konsistente Array gültig sein.

Eingabe

Die erste Zeile enthält eine ganze Zahl $T$ ($1 \le T \le 250$), die Anzahl der Testfälle. Es folgt die Beschreibung der Testfälle.

Jeder Testfall beginnt mit einer ganzen Zahl $n$ ($2 \le n \le 500$), der Länge des Arrays.

Die Summe von $n$ über alle Testfälle überschreitet $500$ nicht.

Interaktion

Um eine Anfrage zu stellen, gib eine Zeile im folgenden Format aus:

? i j

Hierbei gilt $1 \le i, j \le n$. Lies nach jeder Anfrage eine ganze Zahl ein:

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

Anfragen mit $i = j$ sowie wiederholte Anfragen sind erlaubt und zählen zur Gesamtzahl der Anfragen hinzu.

Wenn du die Reihenfolge bestimmt hast, gib eine Zeile im folgenden Format aus:

! p_1 p_2 ... p_n

Jeder Index von $1$ bis $n$ muss genau einmal vorkommen. Das Ausgeben der Antwort zählt nicht als Anfrage.

Wenn deine Antwort korrekt ist, fahre mit dem nächsten Testfall fort, indem du dessen $n$ einliest, oder beende dein Programm, falls dies der letzte Testfall war. Der Interaktor sendet nach einer Antwort keine gesonderte Bestätigung.

Gib nach jeder Anfrage oder Antwort einen Zeilenumbruch aus und leere den Ausgabepuffer (flush). Zum Leeren des Ausgabepuffers kannst du Folgendes verwenden:

  • fflush(stdout) oder cout.flush() in C/C++;
  • System.out.flush() in Java und Kotlin;
  • sys.stdout.flush() in Python.

Falls du eine ungültige Anfrage stellst, das Anfragelimit überschreitest oder eine falsche Antwort ausgibst, erhältst du das Urteil Wrong Answer. Eine Ausgabe, die nicht dem angegebenen Format entspricht, wird ebenfalls als Wrong Answer gewertet. In diesen Fällen beendet sich der Interaktor, ohne eine Fehlermeldung zu senden.

Beispiele

Eingabe 1

2
3

1

1

2

0

Ausgabe 1


? 1 2

? 2 3

! 3 2 1

? 1 2

! 1 2

Hinweis

Im ersten Testfall liefern die Anfragen ? 1 2 und ? 2 3 beide $1$, also gilt $a_1 > a_2 > a_3$. Daher ist $(3, 2, 1)$ eine korrekte Antwort.

Im zweiten Testfall liefert die Anfrage ? 1 2 den Wert $0$, also gilt $a_1 \le a_2$. Daher ist $(1, 2)$ eine korrekte Antwort.

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.