atcoder#ARC070D. [ARC070F] HonestOrUnkind

[ARC070F] HonestOrUnkind

配点 : 13001300

問題文

これはインタラクティブな問題です。

シカのAtCoDeerくんは 00~N1N-1 の番号がついた NN 人の人が集まっているのを見つけました。 この内 AA 人は正直者で、残りの B(=NA)B(=N-A) 人は不親切な人です。 NN 人の人は全員、誰が正直者で、誰が不親切な人かを把握しています。 一方、AtCoDeerくんは、正直者AA 人いて不親切な人BB 人いることしか知りません。 そこで、AtCoDeerくんはこれらの NN 人に質問をして、正直者を全員特定しようとしています。 一回の質問では、AtCoDeerくんは、0a,bN10 \leq a,b \leq N-1 なる aa, bb を選んで、aa さんに「bb さんは正直者ですか?」という質問をします。

正直者は、質問に対し常に Yes か No の正しい答えを返します。 一方、不親切な人は、質問に対し Yes か No のどちらかを恣意的に選んで返します。 つまり、常に嘘をついたり、半分の確率でランダムに答えるといった単純なアルゴリズムではない可能性があります。

AtCoDeerくんは高々 2N2N 回質問をすることができます。質問は順番に行われ、以前の質問の結果から次の質問を決めることが出来ます。

正直者を全員特定してください。 不可能な場合(正確には、どのような 2N2N 回の質問をしようと、不親切な人たちがうまく返答することで、正直者の集合としてありうるものが2つ以上存在するようにできる場合)は、その旨を出力してください。

制約

  • 1A,B20001 \leq A,B \leq 2000

入出力

最初に、標準入力から AABB が以下の形式で与えられる:

A B

もし特定が不可能な場合は、即座に次のように出力し、プログラムを終了しなければならない。:

Impossible

それ以外の場合は、次に、クエリを質問する。 各クエリは、標準出力に以下の形式で出力されなければならない:

? a b

ここで aabb00 以上 N1N-1 以下の整数でなければならない。

次に、クエリの答えが標準入力から以下の形式で与えられる:

ans

ここで ansansY または N である。 Y のときは質問の答えが Yes であることを、N のときは No であることを表す。

最後に、答えを以下の形式で出力しなければならない:

! s_0s_1...s_{N-1}

ここで sis_iii 番の人が正直者なら 1不親切な人なら 0 でなければならない。

ジャッジ

  • 出力のあと、標準出力を flush しなければならない。 そうでないときは TLE の可能性がある。
  • 答えを出力した後、プログラムをすぐに終了しなければならない。そうでないときの挙動は定義されていない。
  • 出力の答えが間違っている場合の挙動は定義されていない (WAとは限らない)。

サンプル

このサンプルでは A=2A = 2, B=1B = 1 で、答えは 101 である。

Input Output
22 11
?? 00 11
NN
?? 00 22
YY
?? 11 00
YY
?? 22 00
YY
?? 22 22
YY
!! 101101

次のサンプルでは A=1A = 1, B=2B = 2 で、答えは Impossible である。

Input Output
11 22
ImpossibleImpossible