C. Hide and Seek

Quiz

https://codeforces.com/contest/1162/problem/C

Submission

https://codeforces.com/contest/1162/submission/53758184

考察

  • 値 i がguess値と同じ時、1度だけ(i-1, i+1に)「分裂」できるとする
  • すでに分裂済みで、またguess値と当たった時「捕まる」とする
  • サンプル1で考えてみる

f:id:peroon:20190505224420j:plain

  • 必要に迫られるまで分裂はしないとする
  • 分裂するときは隣の値(iならi-1, i+1)に分裂する(i=1, i=Nのみ例外)
  • 分裂することなく最後まで行けたなら最後に3分裂するとする(i=1, i=Nのときのみ2分裂)

解法

  • 各値 i=1〜Nを始点とする
  • 初めてguess値とぶつかる時に分裂して避ける
  • それ以降で分裂後の値(i-1, i+1)が捕まらなければ最後まで行ける
  • これは、
    • 各値(1〜N)が最初に出るindex ・・・A
    • 各値が最後に出るindex ・・・B
    • をそれぞれ配列で持っていれば解ける
  • 各値が分裂して避けなければいけないタイミングは、Aで分かる
  • 分裂した値がそれ以降で捕まってしまうかの判定は、Bで分かる

計算量

  • 配列A, Bを事前計算で持っておくことで、各値 i (1〜N)それぞれが最後までたどり着けるか、その時何分岐しているかがO(1)で分かる
  • 各値(1〜N)について求めるので、合計の計算量はO(N)