У Боба есть простой неориентированный связный граф (без кратных ребер и петель). Он хочет узнать, является ли его граф двудольным (то есть вы можете покрасить все вершины графа в два цвета, чтобы не было ребра, соединяющего две вершины одного цвета) или нет. Поскольку он не очень хорошо разбирается в программировании, он попросил Алису о помощи. Он не хочет показывать свой граф Алисе, но он согласился, что Алиса может задавать ему вопросы о графе.
Единственный вопрос, который может задать Алиса, заключается в следующем: она дает Бобу $$$s$$$ — подмножество вершин исходного графа, а он отвечает ей, сколько есть ребер в графе, которые соединяют две вершины в $$$s$$$. Поскольку он не хочет, чтобы Алиса задавала слишком много вопросов, он разрешает ей задать не более $$$20000$$$ вопросов. Кроме того, он подозревает, что Алиса может вводить ложные сообщения в их канал связи, поэтому, когда Алиса наконец сообщит ему, является ли граф двудольным или нет, ей также необходимо предоставить доказательство — или само разделение, или цикл нечетной длины.
Ваша задача — помочь Алисе задавать запросы и проверить, является ли граф двудольным.
Первая строка содержит одно целое число $$$n$$$ ($$$1 \leq n \leq 600$$$) — количество вершин в графе Боба.
Сначала считайте одно целое число $$$n$$$ ($$$1\leq n\leq 600$$$) — количество вершин в графе Боба.
Чтобы сделать запрос, выведите две строки. Первая в формате «? k» ($$$1 \leq k \leq n$$$), где $$$k$$$ — количество вершин в запросе. Вторая строка должна содержать $$$k$$$ различных чисел $$$s_1, s_2, \dots, s_k$$$ ($$$1 \leq s_i \leq n$$$) — вершины в запросе.
После каждого запроса нужно считать одно целое число $$$m$$$ ($$$0 \leq m \leq \frac{n(n-1)}{2}$$$) — количество ребер, которые соединяют вершины в множестве $$$\{s_i\}$$$.
Вы не можете задать более $$$20000$$$ запросов.
Если $$$m = -1$$$, то это значит, что вы задали больше вопросов, чем можно, или то, что вы вывели некорректный запрос. Ваша программа должна немедленно завершиться (например, вызывая функцию exit(0)). Вы получите вердикт Wrong Answer; это значит, что вы задали слишком много вопросов, или то, что вы задали некорректный запрос. Если вы это проигнорируете, вы можете получить любой другой вердикт, так как вы будете продолжать считывать из закрытого потока.
После вывода запроса не забудьте вывести перевод строки и сбросить буфер вывода. В противном случае вы получите вердикт Решение «зависло». Для сброса буфера используйте:
Когда вы уже знаете ответ, вам нужно его вывести.
Формат вывода зависит от того, является ли граф двудольным, или нет.
Если граф двудольный, выведите две строки. Первая строка должна содержать букву «Y» (которая значит «YES»), после нее должен идти пробел и одно целое число $$$s$$$ ($$$0 \leq s \leq n$$$) — количество вершин в первой доли графа. Вторая строка должна содержать $$$s$$$ целых чисел $$$a_1, a_2, \dots, a_s$$$ — вершины, принадлежащие первой доли. Все $$$a_i$$$ должны быть различны, и все ребра в главном графе должны иметь только один конец в $$$\{a_i\}$$$.
Если граф не является двудольным, выведите две строки. Первая строка должна содержать букву «N» (которая значит «NO»), после нее должен идти пробел и одно целое число $$$l$$$ ($$$3 \leq l \leq n$$$) — длина простого цикла нечетной длины. Вторая строка должна содержать $$$l$$$ целых чисел $$$c_1, c_2, \dots, c_l$$$ — вершины цикла. Должно выполнятся условие, что для любого $$$1 \leq i \leq l$$$ должно быть ребро $$$\{c_i, c_{(i \mod l)+1}\}$$$ в главной графе, и все $$$c_i$$$ должны быть различны. Если существует несколько решений, выведите любое из них.
Входные данные для взломов
Для взломов вам нужно использовать специальный формат.
Первая строка содержит два целых числа $$$n$$$ и $$$m~(1 \leq n \leq 600, 0 \leq m \leq \frac{n(n-1)}{2})$$$ — количество вершин и ребер в графе.
Каждая из следующих $$$m$$$ строк содержит два целых числа $$$u_i$$$ и $$$v_i~(1 \leq u_i, v_i \leq n)$$$, которые значат, что существует ребро между вершинами $$$u_i$$$ и $$$v_i$$$. Не должно быть кратных ребер и петель, также граф должен быть связным.
Например, чтобы получить первый пример, нужно ввести такой тест:
4 4
4 1
1 3
3 2
2 4
4
4
0
1
1
1
0
? 4
1 2 3 4
? 2
1 2
? 2
1 3
? 2
1 4
? 2
2 4
? 2
3 4
Y 2
1 2
4
4
3
? 4
1 4 2 3
? 3
1 2 4
N 3
2 1 4
В первом примере Алиса узнает, что в графе есть $$$4$$$ ребра. В следующих трех запросах она узнает, что вершина $$$1$$$ имеет ребра с двумя вершинами: $$$3$$$ и $$$4$$$. Затем она узнает, что, хотя вершина $$$2$$$ имеет ребро с $$$4$$$, вершина $$$3$$$ не имеет ребро с $$$4$$$. Остается только одно возможное местоположение для оставшегося ребра — это $$$(2, 3)$$$. Это значит, что граф представляет собой цикл из четырех вершин, причем $$$(1, 2)$$$ является первой долей, а $$$(3, 4)$$$ второй. Здесь также можно вывести «3 4» как ответ.
Во втором примере мы также имеем граф из четырех вершин и четырех ребер. Во втором запросе Алиса узнает, что между вершинами $$$(1, 2, 4)$$$ есть три ребра. Единственный способ, при котором такое может произойти, это тогда, когда они образуют треугольник. Поскольку треугольник не является двудольным, Алиса может использовать это как доказательство того, что граф не является двудольным. Заметьте, что она не узнала, где находится четвертое ребро, но она в любом случае может уже ответить Бобу.
Название |
---|