Codeforces Round 1020

スポンサーリンク

A. Dr. TC

何もしない場合の個数を求めておくと,各文字を変更した場合の個数はそこからの差分を考えれば計算できます.

B. St. Chroma

$x$ 未満をなるべく早期に使い切り,$x$ をなるべく遅延すればよいです.

C. Cherry Bomb

B[i] != -1 であるところが存在するとき $x$ の候補が高々ひとつになるのでそれを試します.

そうでないとき,$B$ は $-A$ に定数加算したものですが,非負かつ $K$ 以下にするというところから加算範囲が決まります.

D. Flower Boy

各 $x$ に対して $b$ のうち長さ $x$ の prefix を $a$ からとるとき $a$ の prefix 何項分かかるかを貪欲に計算します.suffix についても同様のことをします.

挿入せずにとれるかの判定はこれでできています.挿入するときにはどの $b_i$ で消費するかを固定して,残った $b$ の prefix, suffix をとるために $a$ で必要な prefix, suffix の長さの和が $n$ 以下ならば ok です.

E. Wolf

各値の出現位置は前計算しておきます.$x$ の出現位置が $[l,r]$ にないならば不可能です.

そうでないとき,$f$ の再帰的な計算で左右どちらに進むべきかが決まります.つまり,$x$ 未満であるか $x$ 以上であるかどちらになってほしいかが決まります.未満・以上ですべての項を $2$ 値化すると,次の問題が残ります:

  • 0, 1 列が与えられる(それぞれの個数が分かっている).それぞれ変更後に $0$ になって欲しい,$1$ になって欲しい,なんでもいい,のどれであるかが分かっている.$d$ 箇所いじって目的を達成するための最小の $d$ を求めよ.

あとはこれを適切に計算します.

F. Goblin

$i$ 列目の様子は,$[0,i)$ 行・$i$ 行・$[i,n)$ 行でそれぞれ区間ごとに定数が並びます.ここを最初からひとつの成分と考えておくと,最初から全部で $3n$ 個の成分しかありません.これらの隣接関係も $O(n)$ 通りしかないので,隣接が同じ文字かを見てマージしていけばよいです.

G2. Baudelaire (hard version)

根の場所を特定して,その後 $n$ 回かけて全頂点での値を聞くという方針で解けます.

重心分解を利用します.重心をとり,根が重心と一致するのか,しないならば重心からどの方向の部分木にあるのかが分かればよいです.

重心を $c$,重心の近傍を $v_1,\ldots,v_n$ とします.このとき,根が $subtree(v_l)\cup \cdots \cup subtree(v_r)$ に含まれるかを判定できます.

$c$ を flip し,flip 前後に $U = \{v_l,\ldots,v_r\}$ をクエリします.このときの差分を考えると判定できます.

重心分解の各ノードでこの二分探索をやると根の特定に $O(\log^2n)$ 回です.たぶん最悪ケースは $3(10+9+\cdots+1)$ くらいで,$200$ 回におさまっていると思います.1/3 重心分解のようにやれば $O(\log n)$ 回で根を見つけることもできるはずです.

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