K - Two-Way Communication Editorial /

Time Limit: 500 msec / Memory Limit: 1024 MiB

配点 : 100

問題文

2 つのプログラム Alice, Bob が協力して以下のゲームを行います。

0 以上 2^{64} 未満の整数 A, B があります。はじめ Alice のみが A を、Bob のみが B を知っています。

C := \min(A, B) とします。ゲームの目的は、Alice と Bob の両方が C の値を答えられるようにすることです。

そのために、Alice と Bob は以下の関数を何度でも呼び出して情報をやりとりすることができます。

  • send(x) : 相手のプログラムが receive() を呼び出すまで待機する。その後、 1 bit の値 x を相手に送信する。
  • receive() : 相手のプログラムが send() を呼び出すまで待機する。その後、 1 bit の値 x を相手から受け取って返り値とする。

情報のやり取りが終了した後、各プログラムは以下の関数を 1 度呼び出して C の値を回答する必要があります。

  • answer(x) : C の値が x であると回答する。この関数を呼び出した後、ただちにプログラムを終了しなければならない。

Alice と Bob の両方が正しく C の値を回答したらゲームは成功となります。このとき、関数 send() の呼び出し回数の合計が少ないほど良い評価が得られます。

できるだけ少ない回数の関数の呼び出しでゲームを成功させるような 2 つのプログラム Alice, Bob を作成してください。

入出力

この問題はインタラクティブ問題(あなたの作成したプログラムとジャッジプログラムが入出力を介して対話を行う形式の問題)です。
Alice として振る舞うあなたのプログラムと、Bob として振る舞うあなたのプログラムが、ジャッジプログラムを介してゲームを行います。

プログラムの開始

あなたのプログラムは、まず以下の形式で入力を受け取ってください。

\text{Player}
X

ここで、\text{Player} は文字列 Alice または文字列 Bob であり、X0 以上 2^{64} 未満の整数です。

  • \text{Player} = {}Alice である場合、A = X であることを表します。また、あなたのプログラムはこれ以降 Alice として振る舞わなければなりません。
  • \text{Player} = {}Bob である場合、B = X であることを表します。また、あなたのプログラムはこれ以降 Bob として振る舞わなければなりません。

その後、以下に示す方法で send(), receive(), answer() の呼び出しを行ってください。

send

send 関数を呼び出すには、以下の形式で出力してください。

send x

ここで、x0 または 1 でなければなりません。
この関数は相手のプログラムが receive() を呼び出すまで待機しますが、待機中に相手のプログラムが停止したり、相手も send 関数を呼び出すと WA になります。

receive

receive 関数を呼び出すには、以下の形式で出力してください。

receive

その後、相手のプログラムから送られた値 x を以下の形式で読み取ってください。

x

この関数は相手のプログラムが send() を呼び出すまで待機しますが、待機中に相手のプログラムが停止したり、相手も receive 関数を呼び出すと WA になります。
やり取りの途中で WA となった場合、与えられる入力は -1 になります。この場合、ただちにプログラムを終了してください。

answer

answer 関数を呼び出すには、以下の形式で出力してください。

answer x

ここで、x\min(A, B) と一致していなければなりません。この関数を呼び出した後は、ただちにプログラムを終了してください。

得点

あるテストケースにおける、2 つのプログラムの send() の呼び出し回数の合計を Q' とします。この問題のすべてのテストケースにわたる Q' の最大値を Q として、

  • Q ≤ 76 のとき 100
  • 76 < Q ≤ 128 のとき \left\lfloor 100 - 27 \cdot \ln(\frac{Q-74}{2})\right\rfloor
  • Q > 128 のとき 0 点(WA になります)

が与えられます。

注意点

  • 出力を行うたびに、末尾に改行を入れて標準出力を flush してください。そうしなかった場合、ジャッジ結果が TLE となる可能性があります。
  • ジャッジプログラムと、Alice として振る舞うあなたのプログラムと、Bob として振る舞うあなたのプログラムが同時に実行されます。実行時間・使用メモリはこれらの合計で計測されるため、実行時間・使用メモリには余裕を持ってください。
    • ジャッジプログラムは最大で 50 ms・5 MiB 程度を消費します。
  • この問題では、実行中にファイルを作成することができません。したがって、実行中にファイルを作成するような言語・プログラムでは AC を取ることができません。 例えば、C# では AC を取ることができないため、代わりに C# AOT を使用してください。
  • 0 以上 2^{64} 未満の整数を扱います。オーバーフローには十分注意してください。

入出力例

Alice の入力 Alice の出力 Bob の入力 Bob の出力
Alice
31
Bob
25
send 0 receive
0
receive send 1
1
send 1 receive
1
answer 25 answer 25