Educational Codeforces Round 180

A. Race

そういう if 文を書いてもよいですが,適当な範囲の整数座標を全探索でもよいです.

B. Shrinking Array

最初から条件を満たすなら $0$ を出力.そうでなく単調増加や単調減少ならば $-1$ を出力.

どちらでもなければ $a_{i-1}<a_i>a_{i+1}$ あるいはその逆向きの不等号が成り立つ場所があって,そこに適切な操作をすると $1$ 回で条件を達成可能です.

C. Coloring Game

とりあえず $O(N^3)$ で解けます.相手の戦略として「max をとる」「選ばれた中での max をとる」のどちらかを試せばよいです.

自分が選ぶもののうち最小値以外を $2$ 重ループで全探索して,最小値として選ぶものを尺取り法で数えます.

D. Reachability and Tree

木上での距離が $1$ のペアが $n-1$ 個あってここから reachable なペアが $n-1$ 個はあります.

「木上での距離が $2$ 以上で reachable なペアがちょうどひとつにせよ」ということです.ということはそのペアは距離 $2$ で作らなければいけません.

距離 $2$ のペアの中点に注目します.ここの次数が $3$ 以上だと複数のペアが作られてしまうことが分かります.よって次数 $2$ の頂点の存在が必要です.

これは十分条件にもなります.次数 $2$ の頂点のまわりを適切にしたあと交互に向け付けていく感じで構築できます.

E. Tree Colorings

色塗りの条件は,「赤点の subtree はすべて赤」「青点の subtree はすべて青」です.必要性も十分性も簡単に示せます.

ここから木を固定したときの数え上げを考えます.単に dp[v] を 「subtree(v) の塗り方であって根が緑のものの個数」とすると,$\dp[v]=\prod_{c\in \mathrm{child}(v)}(\dp[c]+2)$ といった計算式になることが分かります.「$+2$」は子を赤または青の単色の subtree にするという選択からきます.

これを踏まえて本問の答えを $\DP[n]$ とすると,$n=a_1a_2\cdots$ ($a_i\geq 3$)としたときの $\DP[n]\leftarrow 1+\sum DP[a_i-2]$ という要領で計算すればよいことが分かります.

F. Variables and Operations

まずは stable かどうかの判定方法です.

適当な始点 $s$ を用意し,$s\to i$ に重み $a_i$ の辺を張ります.また条件 $(x,y,z)$ があるとき $y\to x$ に重み $z$ の辺を張ります.

$s$ から $i$ までの最短距離を $d_i$ とすれば,任意の頂点について最終的に $a_i\geq d_i$ が成り立つことが分かります.例えば $d_i$ の昇順に証明できます.また $a_i=d_i$ を達成することも可能で,これは最短路をとってその順に操作するようにすれば達成できます.

次に $a_i$ として達成可能な最大値ですが,これは $\min(a_i, \min_j(a_j+w_{ji}))$ です.ただし $w_{ij}$ は $i\to j$ 辺の最小重みです.

この値より大きくできないことは対応する辺による更新が一度以上行われることから分かります.この値が達成可能であることは,最初に $i$ に向かう辺による更新をすべて行ってしまうという操作手順から分かります.

あとは,コスト $K$ でこれが達成可能かの判定ですが,ひとつの $a_i$ を $K$ 小さくしたときに stable であるかどうかを上の式に従って判定すればよいです.最短路を達成する $a_i$ のところ以外にもデクリメントしていながら目的を達成していると仮定した場合,それを最短路を達成する $a_i$ のところにうつすという exchange argument を考えればそれだけでよいことが分かります.

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