QOJ.ac

QOJ

Time Limit: 1 s Memory Limit: 512 MB Total points: 100 Difficulty: [show] Interactive

#4218. Скрытый граф

Statistics

Дан простой неориентированный граф с $n$ вершинами. Этот граф обладает дополнительным свойством:

  • Любой порожденный подграф содержит вершину со степенью не более $k$.

Вам необходимо найти этот скрытый граф. Вы можете проверить для любого подмножества вершин, является ли оно независимым множеством. Если это не так, мы покажем вам ребро, оба конца которого лежат внутри этого подмножества.

Мы не будем изменять граф во время взаимодействия, поэтому вы можете считать его фиксированным. Однако мы можем выбрать любое ребро внутри порожденного подграфа для отображения. Иными словами, во всех тестах граф фиксирован, но интерактор является адаптивным.

Вам нужно угадать граф, сделав не более $2nk + n$ запросов.

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

Взаимодействие начинается со строки, содержащей одно целое число $n$: количество вершин в скрытом графе ($2 \le n \le 2000$).

Целое число $k$ не дано, но оно удовлетворяет ограничению $1 \le k < n$, $nk \le 2000$.

После этого вы можете делать запросы.

Чтобы сделать запрос, выведите одну строку, содержащую «? $k$» ($1 \le k \le n$), а затем $k$ различных целых чисел $v_1, v_2, \dots, v_k$ ($1 \le v_i \le n$). Разделяйте числа пробелами. Затем выполните сброс буфера вывода (flush).

После каждого запроса считайте одну строку с двумя целыми числами $i, j$. Если в порожденном подграфе $v_1, v_2, \dots, v_k$ нет ребер, то $i = j = -1$. В противном случае $i \neq j$, $i \in \{v_1, \dots, v_k\}$, $j \in \{v_1, \dots, v_k\}$, и в графе существует ребро с концами $i$ и $j$.

Когда вы найдете граф, выведите в первой строке «! $m$». Затем выведите $m$ строк, каждая из которых должна содержать описание ребра графа: два целых числа $u, v$ ($1 \le u, v \le n$), обозначающих индексы вершин, соединенных ребром.

Ваше решение получит вердикт Wrong Answer или Time Limit Exceeded, если вы сделаете более $2nk + n$ запросов.

Ваше решение получит вердикт Idleness Limit Exceeded, если вы ничего не выведете или забудете сбросить буфер вывода.

Для сброса буфера вывода (flush) необходимо выполнить следующие действия сразу после вывода запроса и символа переноса строки:

  • fflush(stdout) или cout.flush() в C++;
  • System.out.flush() в Java;
  • flush(output) в Pascal;
  • stdout.flush() в Python;
  • см. документацию для других языков.

Примеры

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

3
1 2
2 3
1 3

Выходные данные 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.