Codeforces Round #620 (Div1 + Div2) 参加記録
A, B, Dの3つ解けました。遅かったのでレートは下がりました。(1752 -> 1716)
A Cow and Haybales
苦手系です。割算を頑張りましょう。 こういう割算の算数系はそれほど難しくない割に時間がかかって本当に苦手です。
B Cow and Friend
ちょうどのものがあれば1です。目的地より遠くに飛べれば2です。 目的地より近くにしか跳べないなら、跳べる最長の距離で切り上げ除算です。
C Cow and Message
今見ると簡単ですが頭が混乱していて解けませんでした。 長さ2以下の文字が答えになるので長さ2以下の部分列をそれぞれ数えます。
D Cow and Fields
難しかったです。各special field Pi について始点からの距離と終点からの距離を計算しておきます。これはbfsでできます。 すると、Pi とPjを繋いだときの1-Nの最短パスはd(1, Pi) + d(Pj, N) + 1, d(1, Pj) + d(Pi, N) +1, d(1, N)のいずれかになります。(d(x, y)はつなぐ前のx-yの距離) あとはMin(d(1, Pi)+d(Pj, N), d(1, Pj) + d(Pi, N))が最大となるように(i, j)を見つければいいです。 全探索だとN**2かかるので工夫が必要です。私は以下のようにやりました。
d(1, Pi) をai, d(Pi, N) をbiとする。 ai<aj, bi<bjがあればai, biはいらないので消す。あとは(ai, bi) についてai < aj となるjを調べると最小のajの(aj, bj)を選べばいいことがわかる。aiでソートしてから隣り合うものについてMinを計算してMaxをとる。
以下はtwitterで見つけた賢い解法です。(こういうのって転載いいのかな)
にしても任意の(i,j)(i≠j)の組についてmin(A_i+B_j,A_j+B_i)の最大値を出したいみたいな時に
— 物理好き@1点は大事!(素振り)文章力も大事!(素振り) (@butsurizuki) 2020年2月17日
A_i+B_j <= A_j+B_i
を移項して
A_i-B_i <= A_j-B_j
なのでA_k-B_kの昇順にソートすると(i<j)についてminは絶対A_i+B_jになってこれは累積min使えば出来るってテク、頭から抜けてたな
D,d(1,A)<=d(1,B)が満たされているなら、d(A,N)+d(1,B)のパターンは見なくていい(d(A,N)+d(1,B)>=d(A,N)+d(1,A)>=元々の最短距離)ので、{d(1,A),d(A,N)}でsort
— heno (@heno_code) 2020年2月17日