Kazun の競プロ記録

競技プログラミングに関する様々な話題を執筆します.

AtCoder Beginner Contest 299 D問題 Find by Query

問題

atcoder.jp

提出解答

atcoder.jp

問題の概要

インタラクティブ問題

長さ  N 0,1 からなる整数列  S がある. この  S S_0=0, S_N=1 であることが保証されている.

次の形式の質問を  20 回以内行うことにより,  S_p=S_{p+1}, 1 \leq p \leq N-1 であるような整数  p 1 つ求めよ.

  •  1 \leq i \leq N を満たす整数  i 1 つ選び,  S_i の値を聞く.

制約

  •  2 \leq N \leq 2 \times 10^5

解法

(*)  1 \leq l \lt r \leq N に対して,  S_l=0, S_r=1 ならば,  S_p \neq S_{p+1}, l \leq p \lt r を満たす整数  p が存在する.

このことを利用して, 次のようにすると,  \left \lceil \log_2 N \right \rceil 回の質問でそのような  p を見つけることができる.

  •  l \gets 1, r \gets N とする. このとき, (*) の仮定は成立する.
  •  r-l \geq 2 である限り,  m:=\left \lfloor \dfrac{l+r}{2} \right \rfloor として,  S_m の値を質問する.
    •  S_m=0 ならば,  l \gets m とする. このとき, (*) の仮定は満たされたままである.
    •  S_m=1 ならば,  r \gets m とする. このとき, (*) の仮定は満たされたままである.
  •  r-l=1 のとき, (*) の仮定は満たされており,  l \leq p \lt r であるような整数は  p=l に限られる. よって, この  p S_p \neq S_{p+1} を満たす.

よって,  \left \lceil \log_2 2 \times 10^5 \right \rceil=18 であるので, この方針によって, 条件を満たす  p を発見できる.