ferinの競プロ帳

競プロについてのメモ

Codeforces Round #641 (Div. 1) B. Orac and Medians

問題ページ

k が2つ連続して並んでいる場合、k\ k\ x に操作を適用すればすべて k にできるので k\ k の並びをつくれるならば 'yes' となる。また k\ k以上 と並んでいる場合、操作を適用すれば k\ k の並びをつくれるのでこの場合も 'yes' となる。

あとは k以上 の数を k の隣に持ってくることができるか?の判定を行いたい。先程の場合と同様に考えると k以上 が隣接していれば k以上 を k の隣に持ってこれる。ある区間に操作を行ったときに k以上 の数が中央値になるならば、k以上 の隣接はつくれる。

あとは k以上 が過半数を占めるような区間が存在しているか?を解ければよい。k以上 を+1、k未満 を-1に置き換えた数列を考えると、総和が1以上である区間が存在することと同値である。あとは zero-sum range と同じで、累積和を取ったあと、累積minを持ちながら順番に参照していけばよい。