ABC 072 C問題 Together

問題

C - Together

考察の流れ

ある Xを選んだとき, a_i =Xとなる iの個数を最大化する.

まず, Xを固定した場合. a_i =Xとなる iの個数を最大化するには,数列中の全ての X-1に+1,全ての X+1に-1してあげればいい.

そして, Xとして何を選べば a_i =Xとなる iの個数を最大化できるかについては, Xとして考えられる値を全て調べてあげればいい.各Xに対し,数列中の X-1XX+1の個数の和を出してあげてそれが最大となるXを探す.数列中の X-1XX+1の個数の和を出す処理は,数列をあらかじめソートしておいて二分探索することでO(log N)で可能となる.

また, Xとして考えるべきなのは,数列の値の範囲内のみで問題ない(0\leqX<105).

以上より全体としての計算量はO(105 log N)なので間に合わせることができる.

コード

Submission #2760497 - AtCoder Beginner Contest 072

1発AC 20 minくらいで解いた.

反省

  • カッコよく二分探索をキメたつもりでいたけど, Xを列挙するループ内で毎回二分探索をする必要はない(最初に各数の個数を調べておけばよかった).これで計算量を落とすことができる.
  • とはいえ確実に行けるかつ間に合うやり方で通せたのは良かった.