Educational Codeforces Round 66

スポンサーリンク

A. From Hero to Zero

$k$ で割るまでのステップをまとめて計算すれば $O(\log n)$ ステップで答えが出ます.

B. Catch Overflow!

構文解析です.一度オーバーフローしたら以後の計算を行う必要はありません.

C. Electrification

$k$ 個の距離を小さくするのですが,この $k$ 個は区間から選ばれるとしてよいのでそれを全探索します.二分探索を書きましたが不要です.

D. Array Splitting

区間に分割してそれらを重み $1, 2, 3, \ldots, k$ で足しますが,これは suffix を重み $1, 1, \ldots, 1$ で $k$ 個足すことと言い換えられます.ただし suffix は distinct で,列全体はとらなくてはいけません.

suffix sum をソートして貪欲にとればよいです.

E. Minimal Segment Cover

未被覆の最初の点に対して,それを覆う区間のうちで最も大きな $r$ を選ぶ貪欲法です.

未被覆の点に対して貪欲を $1$ ステップ進めたときの次の点が調べておけば,あとは binary lifting と二分探索によりクエリに答えられます.

F. The Number of Subpermutations

分割統治します.ある境界に対して左側と右側からいくつかずつとるというパターンを調べます.

列の max を左・右どちらからとるかを固定します.左に max があるという仮定と左からとる要素数を決めると右からとる要素数が確定します.これで候補となる subarray が $O(N\log N)$ 個に限定できるので,あとは hash などで判定します.

G. Yet Another Partiton Problem

列の分割に関する dp を $k$ 回反復します.

$1$ 回の反復では分割統治によって,境界の左から右への遷移を行う問題に帰着します.

左側・右側どちらに max があるかで場合分けして遷移の式を書くと,CHT で高速化できることが分かります.単調性のある CHT なので dp の 1 回の更新が $O(N\log N)$ 時間で行えます.

CodeForces
スポンサーリンク
シェアする
maspyをフォローする
maspyのHP
タイトルとURLをコピーしました