ABC164

5完。もうちょっと上の結果が欲しいところではあるが、血流マシマシで楽しめたのでよし。いいセットだった。

A - Sheep and Wolves

言語を確認するクセが付いてしまったので、今回もCEは回避(デフォルトでC言語になっていた)。

Yes,Noじゃないのやめちくりー。本質部分はクッソ簡単なのに1分切れなかった。襲われるときだけunを出力するのはアドホックすぎてやらない。

B - Battle

O(1)で解けそうだけどシミュレーション。簡単なのはすぐにわかるが、きれいな実装はなかなか浮かばない。引き算して0以下になったらループを抜けて、aが正なら高橋君の勝ち。

C - gacha

ソートして、切り替わった回数+1が答え。stringのvectorでもけっこう速いんだね。

D - Multiple of 2019

わからない。3完で終わる恐怖を感じる。まあEと交互に考えればよい。結局、Eを先に解いて戻ってきた。

2019=3*673。素数ではない。なので、あまりが合流したりしないか不安になる。普段、素数の場合しか考えてないの弱いね。まあ10と2019は互いに素なので信じることにする。各s[i]について、そこで終わる2019の倍数の個数を足していけばいい。そこより上位にあるやつらの情報を2019個持つ。あまりがjになるのがp[j]個あって、各あまりがs[i]を付け足すことで何になるかをq[j]で更新していく。基準にする場所は固定だけど、変化する情報に合わせていい感じの場所でp[j]++して、いい感じの場所でans+=p[j]する。かなりうさんくさいけど、1030msでAC。計算量がギリギリなので、想定解じゃないことはわかっていた。でもC++なら通ると思ったし、他の解法も(実装する過程で思いつくことを期待していたが)思いつかなかった。

ABC158Eが類題らしい。

E - Two Currencies

経路を固定すれば一番安い場所で両替すればいいからと思ったが、こまめに両替しながら進むケースもあるんだった。そもそも、時間と銀貨の2つの要素があるので無理。最小消費銀貨で二分探索とか思ってたけど見当違いだった。

さて、ダイクストラ法といえば。銀貨を2500枚(正確にはもうちょっと少ないが)持っていれば両替なしでどこへでも行けるので、状態を「どの都市にいるか」から「どの都市にいて銀貨を何枚持っているか」に拡張できる。これはダイクストラ法で解けそうだ。これで解けているが、ここから細部を詰めて実装するのが大変。銀貨が2500枚を超えるときは2500枚にするとか、銀貨の枚数が0枚から2500枚までは2501通りあるとか、実装ミスりそうな要素が無限にある。体温が上がって精度の高い思考をするのがきつい(じゃあ集中してなくて平熱のときは精度の高い思考ができるのか?)けど、かなり気をつけて書いていたので何とかなった。

F - I hate Matrix Construction

ほとんど考える時間が残ってなくて残念。行と列2つの条件があって不可能に見えるが、「この行はこのビットが立ってないといけない」みたいな条件がたくさんあると思えば?