guess - 数当て (Guess Them All) Editorial by Mitsubachi


$N \leq 100,L = 700$ の最後の小課題を考えます。 $N=1$ の場合は簡単なので、 $N \geq 2$ とします。便宜上正解の数列を $A$ 、質問する数列を $B$ とし、0-indexedとします。

初めに、 $A_{N-1}$ を求めます。これは $B_0$ から $B_{N-2}$ までを $1$ とし、 $B_{N-1}$ に $2$ から $N$ までの数を入れてできる高々 $N-1$ 通りの数列を $B$ として聞けば求まります。
$B_{N-1}=2$ としたときの答えの値を $r$ とします。 $B_{N-1}=i$ としたときの答えが $r+1$ の場合、 $A_{N-1}=i$ です。そのような $i$ がない場合 $A_{N-1}=1$ です。
よって、 $A_{N-1}$ が求まりました。

次に $i \neq A_{N-1}$ について、 $A_j = i$ となるような $j$ を求めることを考えます。
これはまだ $A_j$ の値が未確定であるindexを並べた配列 $c$ を考え、 $A_j=i$ となるような $j$ がどの範囲にあるかを二分探索する要領で求められます。具体的には、 $l \leq j < r$ かつ $A_{c_j} = i$ となるような $j$ が存在するかは $B_{c_k} = i$ ( $l \leq k < r$ ) としそれ以外を $A_{N-1}$ とした $B$ を聞いたときの答えの値 $r$ が $r=1$ か $r=2$ で判定できます。

最後に質問回数を見積もりましょう。 $N$ に対して回数の上界も単調増加するので、 $N=100$ とします。
$A_{N-1} = A_{99}$ を求めるのに高々 $N-1 = 99$ 回必要です。
$i \neq A_{N-1}$ について、 $A_j = i$ となるような $j$ を求めるものに対して、 $c$ の長さにより二分探索のステップ数が異なります。上界は $|c|=1$ の時は $0$ 回、 $|c|=2$ の時は $1$ 回、 $|c|=3,4$ の時は $2$ 回という風に求められるので、合計の上界は $0 \times 1 + 1 \times 1 + 2 \times 2 + 3 \times 4 + 4 \times 8 + 5 \times 16 + 6 \times 32 + 7 \times 35 = 566$ 回です。
そして、最後に正解の数列を答えるのに $1$ 回です。なお、この $1$ 回は二分探索するとき、 $A_i$ が既に判明しているならば常に $B_i$ をその値にして質問するという実装を取ることで削減することもできます。

結局、 \(N=100\) の時高々 \(666\) 回の質問で十分なのでこの問題を解くことができました。

posted:
last update: