Codeforces Round 1029

A. False Alarm

最初の 1 と最後の 1 のインデックスの差を見ればよいです.

B. Shrink

両端は削除されないので $n-2$ という上界があります.両端に $1, 2$ を置けば,他の要素が残っている間は何かしらを削除可能なのでこれで目的が達成可能です.

C. Cool Partition

列を reverse しておきます.最初に選ぶものは,全種類が登場する必要があります.そのようなもののうち最小長さのものとしてよいことも,最初と $2$ 番目の境界をひとつ左に動かすことを考えれば証明できます.

数列の種類数や各値の出現頻度を保持しながら丁寧に尺取りします.

D. Retaliation

$a_1$ と $a_n$ を見ると,操作回数の組を高々ひとつに限定できます.それが条件を満たすかどうかをチェックします.

E. Lost Soul

まずは削除操作を無視して考えます.奇数インデックスの $a, b$ を入れ替えておくと,操作は $a_i := a_{i+1}$ と $b_i := b_{i+1}$ になって考えやすくなります.

さらに,ある $j$ で $a_j=b_j$ を達成したら,そこから左もすべて同じ値にそろえることが可能です.よって,$x=a_j=b_j$ とできるような最大の $j$ を求める問題を解けばよいです.$x$ を固定して考えれば,$a, b$ における最後の $x$ から左をすべて $x$ に置き換えることができて,それ以外は $x$ にできません.よってそれぞれの最後の出現のインデックスの $\min$ をとれば答が求まります.

削除操作も考えます.最初に奇数インデックスをの a, b を入れ替えていたことから,削除操作は,削除してそれ以降の $a,b$ をすべて逆にするという操作になります.削除操作なしのときを上回る可能性があるのは,もともと同じ列にある $x$ が削除操作により逆の列に来る場合です.

同じ列にある最後 $2$ つの $x$ に注目すると,多くの場合そのうち手前の位置に $x$ をそろえることが可能です.ただしインデックスの差が $1$ しかないときに例外で,後ろから $3$ 番目のインデックスも見る必要があります.

F. Wildflower

葉が $3$ つあると,$0$ 通りです(どれかの葉の値が一致してしまう).葉が $1$ つのときは $2^n$ です.

葉が $2$ つのときが問題です.葉には $1, 2$ を割り当てることになるのでこれは $2$ 通り試します.そのあと lca の部分までの長さを $x,y$ として,おおよそ $\min(x,y)$ 個ずつは $2$ を割り当てる必要があり,そこから先は自由という感じになります.この部分を $x=y$ まわりなどに気を付けてきちんと計算します.

G. Omg Graph

path と書いてありますが通常 walk と呼ばれるやつなので注意.

$\min$ の方は,任意のものを選ぶというように緩和します(walk と $j$ を選び,$w_j + \max_i(w_i)$ を最小化するとしてよい).

ここで選ぶ $w_j$ に対応する辺を固定して答を計算することを考えます.辺 $ab$ を固定して,$1\to a\to b\to N$ および $1\to b\to a\to N$ の $2$ 通りを計算します.

すると,$1$ および $N$ から各点までの walk で道中での max が最小となるものが求められればよいことになります.これは unionfind などで求められます(最小全域木をとって木上のパスを見てもよい).

H. Incessant Rain

subarray の長さを $n$ として選ぶ値の出現回数を $m$ とすれば,$k$ は $m-\lfloor(n+1)/2\rfloor=\lceil (2m-n-1)/2\rceil$ です.よって $2m-n$ の最大化を考えればよいです.

選ぶ値 $x$ を固定して解きます.最初に $x$ が $n$ 個あるとして,$x$ に対する変更(削除・追加)が $q$ 個来るとするとき,$O((n+q)\log N)$ 時間で解きます.するとすべての $x$ に対する計算量の総和が $O((N+Q)\log N)$ 時間になります.このような方針をとった場合,答への反映は,「ある変更時刻から次の変更時刻までの間の ANS を一括で chmax する」という形になるので,この部分は双対セグメント木で行えます.

$x$ を固定してそういう計算量で答を求めることを考えると,$+1, -1$ からなる列があって(最初は全部 $-1$),max subarray sum を求める問題に帰着できます.点変更と max subarray sum はセグメント木で解けます.

あとは $x$ に対する計算をすべて終えた後に,列が $-1$ で埋められた状態に戻るようにして同じセグメント木を使いまわせばよいです.

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