結果
A,B,C,DはAC。EはさっきAC。
A - T or T
人数分の電車賃(AN)とタクシー代(B)を比較。
B - Good Distance
Nが最大10なので全探索。
差分の二乗の合計(のが一定以下で判定したけど問題なく通った。
C - Remainder Minimization 2019
なのでを考えればよい。 なので全探索可。
[L,R]が2019の倍数をまたいでいるどちょっとややこしくなるかと思ったけどまたいでいる場合は0になる。最初にこの判定をして後は[L,R]で全探索すれば楽じゃないかな。
D - Rain Flows into Dams
すげえ馬鹿なことしてました。
そもそも105 x105の行列の時点でダメです。
- 雨の量を一つ仮定
山1に降った雨の量()を決めると他の雨の量も求まります。 結果、となっていればそれで答え。
幾つか例を書き出してみて、 の仮定が解より大きいなら 、解より小さいならとなることに気づき、の最小0、最大として二分法で解きました。
寝てる時に「あ、二分法使わなくても差分から一発で求まるわ」と気づいてフートンの中でじたばたしていました。
E - Virus Tree 2
寝て起きたら解けてました。
適当に根を決めます。こいつは自由に通りの色を塗れます。 子は親の分を除いて通り。子が複数ある場合はとなっていきます。
子の子についは親と親の親が使えないので通りになります。子の子が複数あればとなっていきます。
子の子の子についても同様に考えてとなっていきます。
根は、子は、子の子以降はからやっていけばよいです。幅優先探索しながらかけていくだけ。
F - Colorful Tree
そうのうちやる。皆目見当がつかぬ。
解説見ながらAC。解説のをC#に書き換えただけですが。
クエリの処理を考える
色 のすべての辺の長さが に変更されたと仮定して、二頂点 間の距離を求めよ。
まず間の距離を求める。 そのためには根とuの距離()、根とvの距離()、 との共通頂点(最小共通祖先(lca))と根の距離()がわかればよい。
次に色の辺の長さがに変更された場合の距離を求める。それぞれの距離は
変更後のの距離は
最小共通祖先、変更前の根と頂点間の距離、および頂点に対する色の辺の数と色の総長がわかればクエリを処理できる。
最小共通祖先を見つける
割愛。
クエリ処理の高速化を考える
クエリごとに処理をすると時間が足りない()。 頂点ごとに各色の数・総長を記録するとメモリが足りない()。
クエリの読み込みとクエリの処理を分ければよい。
クエリの読み込み
クエリを頂点と紐づける(クエリごとに3つの頂点)。変更前の間の距離を求める。
クエリの処理
色ごとの辺の数と総長を数えながら深さ優先探索を行う(往路で加算、復路で減算すれば根と頂点間の辺の数と総長が出る)。頂点に紐づけられた処理(変更前の長さに対して、では、では)を行えば答えが出る。
*1: 正則です。次数4で計算して勘違いしたようだ(次数が奇数なら正則、偶数なら正則ではない)