$n$ 頂点を持つ単純無向グラフがある。このグラフには以下の追加の性質がある。
- 任意の誘導部分グラフは、次数が $k$ 以下の頂点を少なくとも1つ含む。
この隠されたグラフを特定する必要がある。任意の頂点集合について、それが独立集合であるかどうかを確認できる。もし独立集合でない場合、その集合内に両端点を持つ辺が1つ提示される。
インタラクション中、グラフは変化しないため、固定されていると仮定してよい。ただし、提示される辺は誘導部分グラフ内の任意の辺が選ばれる可能性がある。言い換えれば、すべてのテストケースにおいてグラフは固定されているが、インタラクタは適応的である。
最大で $2nk + n$ 回のクエリでグラフを特定せよ。
インタラクション
インタラクションは、隠されたグラフの頂点数 $n$ ($2 \le n \le 2000$) を表す整数1つを含む行から始まる。
整数 $k$ は与えられないが、制約 $1 \le k < n$ および $nk \le 2000$ を満たす。
その後、クエリを行うことができる。
クエリを行うには、"? $m$" ($1 \le m \le n$) とそれに続く $m$ 個の相異なる整数 $v_1, v_2, \dots, v_m$ ($1 \le v_i \le n$) を1行に出力する。連続する整数は半角スペースで区切ること。その後、出力をフラッシュ(flush)する必要がある。
各クエリの後、2つの整数 $i, j$ を読み込む。誘導部分グラフ $v_1, v_2, \dots, v_m$ 内に辺が存在しない場合、$i = j = -1$ が返される。それ以外の場合、$i \neq j$ であり、$i \in \{v_1, \dots, v_m\}, j \in \{v_1, \dots, v_m\}$ であり、かつグラフ内に端点 $i$ と $j$ を持つ辺が存在する。
グラフを特定したら、最初の行に "! $m$" と出力する。続く $m$ 行にはグラフの辺の情報を出力する。各行には、辺で結ばれた頂点のインデックスを表す2つの整数 $u, v$ ($1 \le u, v \le n$) を含めること。
$2nk + n$ 回を超えるクエリを行った場合、判定は Wrong Answer または Time Limit Exceeded となる。何も出力しなかったり、出力をフラッシュし忘れたりした場合は Idleness Limit Exceeded となる。
クエリを出力し改行した直後に、以下のいずれかの方法でフラッシュを行う必要がある。
- C++:
fflush(stdout)またはcout.flush() - Java:
System.out.flush() - Pascal:
flush(output) - Python:
stdout.flush() - その他の言語については、各言語のドキュメントを参照すること。
入出力例
入力 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