Codeforces Round 545

スポンサーリンク

A. Skyscrapers

行ごと・列ごとに座圧します.マスに対する答は,行・列の圧縮後の要素数およびそのマスがその中で何番目であるかから計算できます.

B. Camp Schedule

$T$ の最長 border を求めて,そこが重複になるように貪欲に t を並べていきます.

C. Museums Tour

$G$ を scc します.そのあと,G の頂点と曜日の組 $(v,d)$ 全体からなる $ND$ 頂点のグラフを考えます.

$(v_1,d_1)$ と $(v_2,d_2)$ は,$v_1$ と $v_2$ が $G$ における同じ強連結成分に属するとき,片方からもう片方に遷移可能なら逆向きの遷移も可能です.これは $(v_1,d_1) \to (v_2,d_2) \to (v_1,d_3)$ という経路を $D$ 回繰り返すと $(v_1,d_1)$ に戻ることから示せます.よってこの関係で $ND$ 頂点を同値類に分類します.

これらの同値類から DAG を作れば,答は DAG のパス上の同値類の価値の総和という形になります.

D. Cooperative Game

$f(n)$ を $n$ 個進んだ場所とします.2 人だけを $1:2$ のペースで進めることにより,$f(n)=f(2n)$ となる最小の $n$ を求めます.この $n$ はサイクルの長さ $c$ の倍数です.

そのあと全員同時に進めて $f(x) = f(n+x) = f(2n+x)$ となる最小の $x$ をとるとここはゴールです.ゴールでないとすると $x$ の最小性に矛盾します.

全体のクエリ数は $2n+t$ です.$2n$ の上界は,$2$ 人ともサイクルに入ってから $c$ ステップかける $2(t+c)$ がとれて,全体のクエリ数が $3t+2c$ 回でおさえられます.

E. Train Car Selection

整理すると,次の形にできます:

列 $(x_i,y_i)$ がある.すべての $i$ に対して $y_i += ax_i+b$ という操作を行う.$[L,R)$ 内での最小値を求めよ.

なぜこうできるかというと,加算もある区間に限られていますが,その他の値はその加算も考慮して初期化した値を入れておくと思うと加算対象を全体にできます.

するとすぐに,次のようにもできます:$1$ 次関数列 $f_i$ がある.$i\in [L,R)$ に対する $f_i(a)$ の最小値を求めよ.

セグメント木の各区間ごとに CHT を持っておけばこれに答えられます.

F. Matches Are Not a Child’s Play

compare は when をふたつ呼べばよいです.

$p$ が最大の頂点を根として根付き木だと思い,$q_v$ を subtree に対する $p_v$ の max とします.すると,$q$ について昇順に消えていきます.$q$ が定数 $k$ である部分は $p_v=k$ を満たす $v$ から根の方向に伸びるパスで,この部分は葉側から昇順に消えていきます.

よって,$q$ を適切に管理し,$q_v$ を取得したり,$q_v\leq k$ となる $v$ の数え上げができればよいです.

根の $p_v$ が常に最大であることから,根が $a$ から $b$ に変更された場合の $q$ の変更処理は,おおよそパス $ab$ 内の $q$ を $q_a$ に書き換えるというパスクエリになります.

HLD をとってパスクエリを区間クエリにすれば,区間代入したり頻度列を管理するだけです.

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