Australia

ウォンバットのブログ

AtCoder Regular Contest 101 D - Median of Medians

解けませんでした。そろそろ本番で700点問題を通せるようになりたい。

解法

答えを二分探索します。「 mの中央値が x以上かどうか」が判定できれば、それを満たす最大の xが答えとなります。
 mの中央値が x以上かどうか」というのは、「 aの中の区間のうち、 x以上の要素が半数以上を占める区間が半数以上かどうか」と言い換えられます。
そのような区間の数を知るには、 a中の各要素を x以上ならば +1 x未満ならば -1と置き換え、その累積和の転倒してない数を求めてやればよいです。
全体の計算量は O(N \log N \log \max a_i)となります。

反省

まず「 mの中央値が xかどうか」を求めようとしました。
 a \pm 1で置き換えたやつの累積和の転倒してない数を求めればよさそうだと思いましたが、これをやるのに O(N \log N)かかるので、 xを各 a_iについて試すとなると厳しいです。
 aを小さい要素から順に見て、差分を計算する……など考えましたが、うまくいきませんでした。
条件を緩くして二分探索に落とすという発想が一切出なかったところに頭の弱さを感じます。数え上げの問題などにも似たようなのがあるので慣れなきゃダメですね。
コンテスト直後ナーバスになって弱音を吐く僕↓