QOJ.ac

QOJ

時間限制: 1 s 記憶體限制: 512 MB 總分: 100 难度: [顯示] 互動

#4218. Ukryty graf

统计

Dany jest prosty graf nieskierowany o $n$ wierzchołkach. Graf ten posiada dodatkową własność:

  • Każdy podgraf indukowany zawiera wierzchołek o stopniu co najwyżej $k$.

Musisz odnaleźć ten ukryty graf. Możesz sprawdzić dla dowolnego podzbioru, czy jest on zbiorem niezależnym. Jeśli nie jest, pokażemy Ci krawędź, której oba końce znajdują się wewnątrz tego zbioru.

Nie zmieniamy grafu w trakcie interakcji, więc możesz założyć, że jest on ustalony. Możemy jednak wybrać dowolną krawędź wewnątrz podgrafu indukowanego, którą Ci pokażemy. Innymi słowy, we wszystkich testach graf jest ustalony, ale interaktor jest adaptacyjny.

Musisz odgadnąć graf w co najwyżej $2nk + n$ zapytaniach.

Interakcja

Interakcja rozpoczyna się od wczytania jednej linii zawierającej liczbę całkowitą $n$: liczbę wierzchołków w ukrytym grafie ($2 \le n \le 2000$).

Liczba całkowita $k$ nie jest podana, ale spełnia warunek $1 \le k < n$ oraz $nk \le 2000$.

Następnie możesz wykonywać zapytania.

Aby wykonać zapytanie, wypisz jedną linię zawierającą "? $k$" ($1 \le k \le n$), a następnie $k$ różnych liczb całkowitych $v_1, v_2, \dots, v_k$ ($1 \le v_i \le n$). Kolejne liczby oddziel spacjami. Następnie opróżnij bufor wyjściowy (flush).

Po każdym zapytaniu wczytaj jedną linię z dwiema liczbami całkowitymi $i, j$. Jeśli w podgrafie indukowanym przez $v_1, v_2, \dots, v_k$ nie ma krawędzi, to $i = j = -1$. W przeciwnym razie $i \neq j$, $i \in \{v_1, \dots, v_k\}$, $j \in \{v_1, \dots, v_k\}$, a krawędź o końcach $i$ oraz $j$ istnieje w grafie.

Gdy odnajdziesz graf, w pierwszej linii wypisz "! $m$". Następnie w kolejnych $m$ liniach wypisz opis krawędzi grafu; każda z nich powinna zawierać dwie liczby całkowite $u, v$ ($1 \le u, v \le n$), oznaczające indeksy wierzchołków połączonych krawędzią.

Twoje rozwiązanie otrzyma werdykt Wrong Answer lub Time Limit Exceeded, jeśli wykonasz więcej niż $2nk + n$ zapytań.

Twoje rozwiązanie otrzyma werdykt Idleness Limit Exceeded, jeśli nic nie wypiszesz lub zapomnisz opróżnić bufor wyjściowy.

Aby opróżnić bufor (flush), musisz wykonać następujące czynności bezpośrednio po wypisaniu zapytania i znaku nowej linii:

  • fflush(stdout) lub cout.flush() w C++;
  • System.out.flush() w Javie;
  • flush(output) w Pascalu;
  • stdout.flush() w Pythonie;
  • sprawdź dokumentację dla innych języków.

Przykład

Wejście 1

3
1 2
2 3
-1 -1

Wyjście 1

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

Editorials

IDTypeStatusTitlePosted ByLast UpdatedActions
#1012EditorialOpen题解Qiuly2026-02-14 01:41:30View

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.