No.3592 I Love LIS
タグ : / 解いたユーザー数 8
作問者 :
問題文
これはインタラクティブな問題(あなたの作成したプログラムとジャッジシステムが標準入出力を介して対話を行う形式)です。
古代の神殿には「神託(Oracle)」が存在し、長さ $N$ の順列 $P = (P_1, P_2, \dots, P_N)$ を隠し持っています。順列とは、$1$ から $N$ までの整数がそれぞれちょうど $1$ 回ずつ現れる数列のことです。
あなたは神託に質問(クエリ)を送ることで、この隠された順列を特定しようとしています。 $1$ 回のクエリで、あなたは長さ $N$ の好きな整数配列 $A = (A_1, A_2, \dots, A_N)$ を指定します。神託は直ちに順列 $P$ に従って配列を並び替え、新しい数列 $S$ を生成します。具体的には、$S_i = A_{P_i} \ (1 \le i \le N)$ となります。 その後、神託は生成された数列 $S$ の最長狭義単調増加部分列 (LIS) の長さを返します。
※狭義単調増加部分列とは、$S$ からいくつかの要素を抜き出し、元の順序を保ったまま並べた列 $S_{i_1}, S_{i_2}, \dots, S_{i_k} \ (i_1 < i_2 < \dots < i_k)$ であって、$S_{i_1} < S_{i_2} < \dots < S_{i_k}$ を満たすもののことです。
できるだけ少ないクエリ回数で、隠された順列 $P$ を全て特定してください。
入出力
最初に、順列の長さ $N$ が標準入力から与えられます。
$N$
続いて、あなたのプログラムは神託にクエリを送信することができます。クエリは以下の形式で標準出力に出力してください。
? $A_1\ A_2 \cdots A_N$
ここで、$A_i$ は $-10^9 \le A_i \le 10^9$ を満たす整数でなければなりません。
クエリを送信した後、ジャッジシステムから LIS の長さ $X$ が標準入力に与えられます。
$X$
- $X \ge 0$ のとき:$X$ は生成された数列 $S$ の LIS の長さです。
- $X = -1$ のとき:送信したクエリの形式が間違っていた場合や、クエリ制限回数を超過した場合に与えられます。この場合、プログラムを直ちに終了させてください。そうしない場合のジャッジ結果は不定です(
TLE等になる場合があります)。
順列のすべての要素が特定できた場合、以下の形式で解答を出力し、プログラムを正常終了させてください。解答の出力はクエリ回数にカウントされません。
! $P_1\ P_2 \cdots P_N$
【注意】
各出力(クエリおよび解答)の後には必ず標準出力をフラッシュ (flush) してください。フラッシュしない場合、TLE や WA となる可能性があります。
最後に改行してください。
制約
- $2 \le N \le 1000$
- $N$ は整数である
- クエリ送信回数の上限は $12,000$ 回
サンプル
サンプル1
入力
3 2 1
出力
? 10 20 30 ? 0 0 0 ! 3 1 2
このサンプルは、$N=3$ で、隠された順列が $P = (3, 1, 2)$ である場合のやり取りの例を示しています。(※実際の実行時には、入力と出力が対話的に行われます)。
- まず、長さ $N=3$ が標準入力に与えられます。
- あなたのプログラムが最初のクエリとして
? 10 20 30を送信します。このとき配列は $A_1=10, A_2=20, A_3=30$ となります。 神託は内部で $S = (A_{P_1}, A_{P_2}, A_{P_3}) = (A_3, A_1, A_2) = (30, 10, 20)$ を生成します。 $S$ の LIS は $(10, 20)$ であり、その長さは $2$ であるため、神託は標準入力へ2を返します。 - 次のクエリとして
? 0 0 0を送信します。 神託は内部で $S = (0, 0, 0)$ を生成します。 狭義単調増加である必要があるため、LIS の長さは $1$ となり、神託は標準入力へ1を返します。 - 以上の情報などから順列が $P = (3, 1, 2)$ だと特定できたため、
! 3 1 2と出力してプログラムを終了します。解答フェーズの前に送ったクエリは $2$ 回であり、上限回数以下のため正答となります。
提出するには、Twitter 、GitHub、 Googleもしくは右上の雲マークをクリックしてアカウントを作成してください。