No.3523 順路指定最近点
タグ : / 解いたユーザー数 14
作問者 : 👑
t9unkubj
問題文
この問題はリアクティブ形式の(ジャッジ側のプログラムと対話的に実行する必要がある)問題です。
最初に $2$ 以上の整数 $N$ が与えられます。
ある村には $N$ 個の広場と、それらを双方向に結ぶ $0$ 本以上の道があります。道の情報は入力で与えられません。
広場は $N$ 以下の各正整数 $i$ で番号付けられ広場 $i$ と呼ばれます。
道は相異なる $2$ つの広場を結んでおり、その長さは正整数です。相異なる $2$ つの広場それぞれについて、それらを結ぶ道は高々 $1$ 本しかありません。
広場間を移動する経路の経路長とは、通った道の長さの総和です。ただしここでは経路と言った時、$1$ 本以上の道のみを重複なく通って移動するものを指します。
$N$ 以下の正整数全体の集合を $I_N$ と置き、長さ $1$ 以上の $I_N$ の順列全体の集合を $P_N$ と置きます。
順列とは(クリックで開く)
非負整数 $\ell$ と集合 $S$ に対し、長さ $\ell$ の $S$ の順列とは大雑把には $S$ の要素数 $\ell$ の部分集合の番号付けのことです。
より正確には、$\ell$ 以下の正整数全体の集合から $S$ への単射な写像のことです。
例えば長さ $2$ の $\{1,4,5,7\}$ の順列は $(1,4), (1,5), (1,7), (4,1), (4,5), (4,7), (5,1), (5,4), (5,7), (7,1), (7,4), (7,5)$ の $12$ 通りあります。
競技プログラミングにおいて頻繁に「長さ $\ell$ の順列」が $S$ と関係のない概念として常に「$\ell$ 以下の正整数の並び替え」を指すものとして誤用されたり「$S$ の順列」が $\ell$ と関係のない概念として常に「$S$ の要素全体の番号付け」を指すものとして誤用されたりしていますが、実際には $\ell$ と $S$ に依存する概念であることに注意しましょう。
例えば上で挙げたように $(1,4)$ は、$2$ 以下の正整数の並び替えではありませんが長さ $2$ の順列ですし、$\{1,4,5,7\}$ 全体の並び替えではありませんが $\{1,4,5,7\}$ の順列です。
$p \in P_N$ に対し、$p$ に沿う順路とは、広場間を移動する経路であって、通る順に広場の番号を並べて得られる数列が $p$ の連続とは限らない部分列であって $p$ の先頭と末尾を含むものとなるもののことです。
$p \in P_N$ に対し、$p$ に沿う順路が存在するならばその経路長の最小値を $L(p)$ と置き、存在しないならば $L(p) = \infty$ と定めます。ただし $\infty$ は全ての正整数より大きい値として扱います。
$\infty$ の正確な意味はこちらです。(クリックで開く)
実解析などの分野で $\infty$ を $1$ つの項として厳密に扱いたい時は、$\mathbb{R}$ に属さないことが分かっている1つの項を適当に固定してそれを $\infty$ と置くことで $\infty$ を定式化します。どの項を $\infty$ と置いても影響が出ないように議論をするため具体的にどう置くかを明言しないことが多いのですが、定式化の具体例が必要な場合は $\infty$ を例えば $\mathbb{R}$ そのものであると定義します。こうすれば、通常の集合論において $\infty$ が $\mathbb{R}$ に属さないこと、すなわち実数と区別できることが保証されます。そして必要ならば $\mathbb{R} \cup \{\infty\}$ には $\mathbb{R}$ の順序や演算を拡張するようなものを適宜定めて使うことが多いです。今回もそのように順序を定めます。
長さ $N$ 未満の $p \in P_N$ に対し、$p$ の成分に現れない $j \in I_N$ 全体における組 $(L(p \textrm{⌒} (j)),j)$ の辞書順での最小値を $(w_p,j_p)$ と置きます。
ただし $p \textrm{⌒} (j)$ は $p$ の末尾に $j$ を挿入することで得られる $I_N$ の順列を表します。また実際に最小値が存在することは証明可能です。
順路大好きbotは順路が大好きなbotです。
以下の一連のやり取り(以下、質問と呼ぶ)を $0$ 回以上 $N$ 回以下の好きな回数行います。
- まずあなたが長さ $N$ 未満の $p \in P_N$ を選び、$p$ の成分に現れない $j \in I_N$ 全体における組 $(L(p \textrm{⌒} (j)),j)$ の辞書順での最小値 $(w_p,j_p)$ を尋ねる。
- 続いて順路大好きbotが組 $(w_p,j_p)$ を答える。
その後、先頭と末尾がそれぞれ $1, N$ である $p \in P_N$ 全体における $L(p)$ の最小値を求めてください。以下この値を $d(1,N)$ と置きます。
入出力
$p \in P_N$ とその長さ以下の正整数 $\ell$ に対し $p$ の $\ell$ 個目の成分を $p_{\ell}$ と書き表します。
整数または $\infty$ である値 $w$ に対し、$w = \infty$ ならば $w' = -1$、$w \neq \infty$ ならば $w' = w$ と定めます。
最初に $N$ が標準入力から $1$ 行で与えられます。
$N$
その後で $0$ 回以上 $N$ 回以下の好きな回数質問をしてください。質問は標準入出力を用いて以下の形式で行います:
- まず $N$ 未満の正整数 $L$ と長さ $L$ の $p \in P_N$ を選びます。その後
?と $L$ を半角空白区切りで $1$ 行に出力して改行し、$L$ 以下の正整数 $\ell$ に対する $p_{\ell}$ を $\ell$ が小さい順に半角空白区切りで $1$ 行で出力してください。 - 続いて $w_p', i_p$ が半角空白区切りで $1$ 行で与えられます。この際のジャッジ計算量は $O(N^2)$ であることが保証されます。
? $L$ $p_1$ $\cdots$ $p_L$
$w_p'$ $i_p$
次にあなたはこの問題に対する答えを標準出力に以下の形式で出力してください:
-
!と $d(1,N)'$ を半角空白区切りで $1$ 行で出力してください。
! $d(1,N)'$
最後に改行してください。
制約
入力では与えられませんが、道は以下の制約を満たします:
- どの広場を道が結ぶかやその長さは全ての質問の前に固定しており、すなわち質問の前後で変化しない。
- 道は相異なる広場を結ぶ。
- 任意の $i,j \in I_N$ に対し、広場 $i$ と広場 $j$ を結ぶ道は高々 $1$ 本である。
- 道の長さは $10$ 以下の正整数である。
入力は以下の制約を満たします:
- $N$ は $2 \leq N \leq 10$ を満たす整数である。
- 長さ $N$ 未満の任意の $p \in P_N$ に対し、$p$ の成分に現れない $j \in I_N$ 全体における組 $(L(p \textrm{⌒} (j)),j)$ の辞書順での最小値を尋ねた際の返答である入力 $w_p', j_p$ は以下を満たす。
- $w_p'$ は $w_p = -1$ または $1 \leq w_p \leq 10(N-1)$ を満たす整数である。
- $j_p$ は $1 \leq j_p \leq N$ を満たしかつ $p$ の成分に現れない整数である。
注意
リアクティブ形式の問題に慣れてない方は、リアクティブ形式の問題についてのまとめも参考にしてください。
この問題において、以下の指示に従っていない提出のジャッジ結果は保証しません:
- 出力は指定された形式に厳格に従ってください。例えば余計な空白を入れたりしないでください。
- 出力を行うたびに末尾に改行を入れて標準出力をflushしてください。
- この問題に対する答えを出力した後はプログラムをすぐに終了させてください。
サンプル
サンプル1
以下は $N = 2$ であり広場を結ぶ道が $0$ 本である状況における対話の一例です。
| 入力 | 出力 | 説明 |
|---|---|---|
2 |
$N = 2$ です。道の情報は入力で与えられません。 | |
? 1 1 |
あなたは $p = (1)$ に対し、$p$ の成分に現れない $j \in I_N$ 全体における組 $(L(p \textrm{⌒} (j)),j)$ の辞書順での最小値 $(w_p,j_p)$ を尋ねました。 | |
-1 2 |
順路大好きbotは $(w_p,j_p) = (\infty,2)$ であると答えました。実際、$p$ の成分に現れない $i \in I_N$ は $2$ のみであり、$p \textrm{⌒} (2)$ に沿う順路は存在しません。 | |
? 1 2 |
あなたは $p = (2)$ に対し、$p$ の成分に現れない $j \in I_N$ 全体における組 $(L(p \textrm{⌒} (j)),j)$ の辞書順での最小値 $(w_p,j_p)$ を尋ねました。 | |
-1 1 |
順路大好きbotは $(w_p,j_p) = (\infty,1)$ であると答えました。実際、$p$ の成分に現れない $i \in I_N$ は $1$ のみであり、$p \textrm{⌒} (1)$ に沿う順路は存在しません。 | |
! -1 |
あなたは $d(1,N) = \infty$ と答えました。これは正解です。 |
サンプル2
以下は $N = 4$ であり
- 広場 $1$ と広場 $2$ を結ぶ長さ $1$ の道がある。
- 広場 $2$ と広場 $3$ を結ぶ長さ $1$ の道がある。
- 広場 $3$ と広場 $4$ を結ぶ長さ $2$ の道がある。
- 広場 $1$ と広場 $4$ を結ぶ長さ $3$ の道がある。
- 他に道はない。
$\displaystyle \begin{array}{rcl} \displaystyle 1 &\displaystyle \stackrel{1}{\longleftrightarrow} &\displaystyle 2 \\ \displaystyle {}_3 \updownarrow &\displaystyle &\displaystyle \updownarrow {}_1 \\ \displaystyle 4 &\displaystyle \stackrel{2}{\longleftrightarrow} &\displaystyle 3 \\ \end{array} $
という状況における対話の一例です。
| 入力 | 出力 | 説明 |
|---|---|---|
4 |
$N = 4$ です。道の情報は入力で与えられません。 | |
? 2 2 3 |
あなたは $p = (2,3)$ に対し、$p$ の成分に現れない $j \in I_N$ 全体における組 $(L(p \textrm{⌒} (j)),j)$ の辞書順での最小値 $(w_p,j_p)$ を尋ねました。 | |
1 1 |
順路大好きbotは $(w_p,j_p) = (1,1)$ であると答えました。例えば $2 \to 1$ という経路の経路長は $1$ であり、$(2,1)$ は $p \textrm{⌒} (1) = (2,3,1)$ の連続するとは限らない部分列なのでこの経路は $p \textrm{⌒} (1)$ に沿う順路です。 | |
? 2 3 2 |
あなたは $p = (3,2)$ に対し、$p$ の成分に現れない $j \in I_N$ 全体における組 $(L(p \textrm{⌒} (j)),j)$ の辞書順での最小値 $(w_p,j_p)$ を尋ねました。 | |
2 1 |
順路大好きbotは $(w_p,j_p) = (2,1)$ であると答えました。例えば $3 \to 2 \to 1$ という経路の経路長は $2$ であり、$(3,2,1)$ は $p \textrm{⌒} (1) = (3,2,1)$ 自身の連続するとは限らない部分列なのでこの経路は $p \textrm{⌒} (1)$ に沿う順路です。辞書式順序に関して $(2,1) < (2,4)$ であるので $(w_p,j_p) \neq (2,4)$ であることに注意しましょう。 | |
? 3 1 2 3 |
あなたは $p = (1,2,3)$ に対し、$p$ の成分に現れない $j \in I_N$ 全体における組 $(L(p \textrm{⌒} (j)),j)$ の辞書順での最小値 $(w_p,j_p)$ を尋ねました。 | |
3 4 |
順路大好きbotは $(w_p,j_p) = (3,4)$ であると答えました。例えば $1 \to 4$ という経路の経路長は $3$ であり、$(1,4)$ は $p \textrm{⌒} (4) = (1,2,3,4)$ の連続するとは限らない部分列なのでこの経路は $p \textrm{⌒} (4)$ に沿う順路です。 | |
? 3 1 3 2 |
あなたは $p = (1,3,2)$ に対し、$p$ の成分に現れない $j \in I_N$ 全体における組 $(L(p \textrm{⌒} (j)),j)$ の辞書順での最小値 $(w_p,j_p)$ を尋ねました。 | |
3 4 |
順路大好きbotは $(w_p,j_p) = (3,4)$ であると答えました。例えば $1 \to 4$ という経路の経路長は $3$ であり、$(1,4)$ は $p \textrm{⌒} (4) = (1,3,2,4)$ の連続するとは限らない部分列なのでこの経路は $p \textrm{⌒} (4)$ に沿う順路です。 | |
! 3 |
あなたは $d(1,N) = 3$ と答えました。これは正解です。 |
提出するには、Twitter 、GitHub、 Googleもしくは右上の雲マークをクリックしてアカウントを作成してください。