/ 最近 .rdf 追記 編集 設定 本棚

脳log[20241014]



2024年10月14日 (月) [AtCoder] お風呂デバッグ完了しました。精進。おとといあった ABC375-F Road Blocked。E 問題が WA/TLE だったのを見てから 21 分で実装したものが WA だった。考える要素がほぼない典型問題でさえ得点できないなら俺の得点源はどこにある?■制約から多重辺なし、自己辺なし。頂点数の制約からワーシャルフロイド法によって全点間距離を求めることができるので、クエリ2に答えるのは一瞬。クエリを逆向きに見れば、辺が不通になるとは辺が新しく利用できるようになること。あるクエリで不通になった辺が以降のクエリでもずっと不通であることはサンプルをよく読んで確かめている。ワーシャルフロイド法をちょっと修正すれば、ある辺を必ず使う場合の最短距離を更新することができる。具体的には3重ループの最外ループが司る中継点を a または b に固定する。順番にやってもいいと思うけど、自分は同時にやった。中継点が a ならコスト c を足して b にワープさせる。逆向きのワープも同様に。そして中の2重ループが司る始点と終点がそれぞれ s と t のとき、D(s,a)+c+D(b,t) もしくは D(s,b)+c+D(a,t) が最短距離の候補になる。D 関数についてはいちいち書かない。■WAAC の差分は1行だけ。新しく利用可能になる直通辺が a-b 間の最短距離であるとは限らないという当たり前のことが抜けていた。どこから勘違いが生まれたのか想像することができる。ワーシャルフロイド法を実行する前、2次元の表 D[N][N] は直通辺だけが記録されたグラフ表現の一種だった。3乗のアルゴリズムを実行することで辺を辿った結果を含む最短距離の表に更新されるのだけど、自分の頭は更新されていなかった。クエリ1を実行するとき D[a][b]==INF だと考えてしまっていた。考えなかったわけではなく、勘違いしていた。無条件に c 書き込んでいいのか一瞬考えて、問題ないと判断していた。■無向グラフにワーシャルフロイド法を使用するとき、ループの回数を半分にすることで TLE の可能性を減らすことができるのは、ABC369-E を通して刻み込んだ学び (20240831)。■C 問題と E 問題についても書きたいけど、まだ解けてないので書けない。■精進2。ARC185-A mod M Game 2 (緑 diff)。すぐにむりむりわからんと投げ出したくなるけど、緑 diff だというのをもう知っているし、テストケースの多さからもシンプルに解けるのがわかる。ちょっとこらえて視覚的に考えてみると (M おきに印が付いた数直線にそって場のカードの和を表す棒グラフが伸びていくイメージ)、そのときどきで出してはいけないカードが高々1枚しかないとわかる。N<M だしね。最後の1枚になるまではどちらも絶対に負けない。2N 枚のカードの数の和で Bob の負けが判定できる。これだけではサンプルが合わなかったのでまだ考える。Bob が最後の1枚を決め打って温存するなら、Alice が N 枚目のカードを出したときの場の和を Bob が N 通り選ぶことができる。その N 通りに M の倍数が含まれるなら Alice を負かすことができる。Bob はその1枚を最後まで温存できるのだろうか。できるに決まってる。出してはいけないカードはあるけど出さなければ負けるカードはない。そんな当たり前のことも確認しなければわからない。提出 #58815966 (AC / 121 Byte)。かけた時間で判断すれば 300 点問題。事前知識を考慮して高めに見積もっても 400 点。<追記>できるに決まってはいなかった。2枚持っていて一方が出してはいけないカードならもう一方を出すしかない。温存できるの?</追記>■精進3。ARC185-B +1 and -1 (水 diff)。右の要素の高さを左に寄せることで右上がりの坂を作る。右に寄せられるなら何の問題にもならないけど、左にしか寄せられない。制約から判断して要素を左から見ていくことにする。二度見三度見は許されない。ネックになるのは、均した結果がある高さになるとしてその右側がへこんでしまうのがいけない。そのへんをうまくやるために4つのパラメータを記録した。すなわち、(現在の要素までの総和、均してもこれより低くできない高さの最大高さ、その位置、その位置までの総和)。提出 #58816249 (WA / 294 Byte)。A 問題から 31 分でまずは WA。提出 #58816379 (AC / 295 Byte)。その修正に 15 分。小なりを小なりイコールに修正した。文字にして初めて思ったけど、なんで小なりと equal がくっついてひとつの言葉を作ってるの?