J - Median Query 解説

実行時間制限: 5 sec / メモリ制限: 1024 MB

配点 : 400400

問題文

これはインタラクティブな要素がある問題です。

Alice は 11 から NN までの整数を並び替えた順列 a1,a2,,aNa_1, a_2, \ldots, a_N を隠し持っています。隠し事が嫌いな Bob はなんとかしてこの順列を特定したいです。できるだけこの順列を隠したい Alice は順列のサイズ NN と以下の 22 つのタイプの質問の答えのみを教えてくれます。

  • タイプ 11: 33 つの異なる整数 i,j,k(1i,j,kN)i,j,k(1 \leq i,j,k \leq N) を選び、Alice に聞きます。すると、Alice は ai,aj,aka_i,a_j,a_k33 つの整数の中央値を答えます。
  • タイプ 22: 22 つの異なる整数 i,j(1i,jN)i,j(1 \leq i,j \leq N) を選び、Alice に聞きます。すると、Alice は ai,aja_i, a_j の小さい方の添え字を答えます。つまり、ai<aja_i < a_j であれば ii, そうでなければ jj を答えます。

ただし、Alice はあまり順列の情報を与えたくないので、タイプ 11 の質問には 2N2N 回、タイプ 22 の質問には 22 回しか答えません。さらに、Alice はいじわるなので、Bob のこれまでの質問に対する返答に矛盾しない範囲で順列の並びを途中で変えてしまうかもしれません。

Bob はとても忙しいので、熟考して質問することができません。Bob の代わりに、質問をして順列を当てるプログラムを作成し、彼を助けてください。

制約

  • 4N6×1044 \leq N \leq 6 \times 10^4

部分点

  • タイプ 11 の質問の上限は 3N3N 回、タイプ 22 の質問の上限は 33 回である。この上限を超えて質問をした場合は Query Limit Exceeded となる。
  • 質問回数が上限を超えず、かつ正しい順列を出力したとき、2020 点が得られる。
  • タイプ 11 の質問が 2N2N 回以内、かつタイプ 22 の質問が 22 回以内であり、さらに正しい順列を出力したとき、満点が得られる。

入出力

最初に順列のサイズ NN11 行で与えられる。

NN

タイプ 11 の質問をするときは次の形式に従って出力すること。

? 11 ii jj kk

i,j,ki,j,k11 から NN までの相異なる整数でなければならない。末尾には改行を出力すること。

タイプ 11 の質問の答えは以下の形式で与えられる。

mm

mm11 から NN までの整数である。これは ai,aj,aka_i,a_j,a_k33 つの整数の中央値である。

タイプ 22 の質問をするときは次の形式に従って出力すること。

? 22 ii jj

i,ji,j11 から NN までの相異なる整数でなければならない。末尾には改行を出力すること。

タイプ 22 の質問の答えは以下の形式で与えられる。

kk

kkii または jj である。ai<aja_i < a_j であれば ii, そうでなければ jj が出力される。

タイプ 11 の質問の上限は 3N3N 回、タイプ 22 の質問の上限は 33 回である。この上限を超えて質問をした場合は Query Limit Exceeded となる。

質問を何回かした後、順列を当てる必要がある。その際は次の形式に従って出力すること。

! a1a_1 a2a_2 a3a_3 \cdots aNa_N

順列を出力した後、あなたのプログラムは直ちに終了しなければならない。終了しなかった場合のジャッジ結果は不定である。

また、これら以外のフォーマットで出力した場合のジャッジ結果も不定である。

各出力の後には、出力をフラッシュする必要があることに注意せよ。例えば、タイプ 11 の質問をする際、 C では

printf("? 1 %d %d %d\n", i, j, k); fflush(stdout);

C++ では

cout<<"? 1 "<<i<<" "<<j<<" "<<k<<endl;

と出力すればよい。

順列は最初から固定されていないテストケースがあるので注意せよ。

入出力例

順列が "3,5,4,1,23,5,4,1,2" である場合に、以下のような入出力が考えられる。

解答プログラムの出力 解答プログラムへの入力 説明
55 順列のサイズ 55 が入力として与えられる
? 11 11 22 33 タイプ 11 の質問をする、a1,a2,a3a_1, a_2, a_3 の中央値を聞いている
44 a1,a2,a3a_1, a_2, a_3 の中央値は 44 である
? 22 22 44 タイプ 22 の質問をする、a2a_2a4a_4 ではどちらが小さいか聞いている
44 a2>a4a_2 > a_4 であるので、44 が与えられる
? 11 11 55 44 タイプ 11 の質問をする、a1,a5,a4a_1, a_5, a_4 の中央値を聞いている
22 a1,a5,a4a_1, a_5, a_4 の中央値は 22 である
! 33 55 44 11 22 順列が "3,5,4,1,23,5,4,1,2" であると回答している

これは入出力の一つの例であり、意味のある入出力をしているとは限らない。



2025-04-06 (日)
13:45:23 +00:00