ABC310

5完。今日はいけると思ったのになあ。Eまでのスピードはけっこうよかったらしい。実際調子はよかったと思う(今週はスマホのことでばたばたしてたけど今日の昼の段階でARCの復習をやれるところまで回復できた)。それなのにFかすりもしないの。一番の得意分野である競プロの能力がゴミカスすぎる。悔しい。

A - Order Something Else

Dの最小値を求めて使う。

B - Strictly Superior

Mが64より大きいので仕方なくbitsetを使った。否定演算子は使えるし、一つでも立ってるかはanyで得られる。

考察と実装に時間がかかるのは自分の力不足だからこれでレーティングが下がることに異論はない。ただ、貴重なコンテスト時間がこんな簡単な問題で10分も奪われるのが悲しい。

C - Reversible

ボールと棒の話、わかりにくくなるだけだろ。内容も一瞬かなり怖そうに見えるが、reverseしたものと辞書順で小さいほうを採用すればsetに入れていくだけ。あとから考えると、同じ棒であることは同値関係になっていて、それがわかっていれば怖がることはなかった。

D - Peaceful Teams

Nが小さい。チーム分け列挙は、N人を順番に既存のチームに入るか新しいチームを作るかさせながら追加していけばいい。これの末端ノード数はNの階乗より小さくなるので間に合う(この問題は実際に動かして確認できるが、これは間に合う解法だから実装に入っていいという意味)(10の階乗思ったよりかでかくてびびった)。DFSをする。辺はビットで持ったほうが扱いやすい。末端でチーム数がTのものをカウント。相性悪い相手がいなければ再帰。現在のチーム数を変数kで管理していて、kをインクリメントして再帰に入るとき、新しいチームを作ったかの判定に変化後のkを使っていてバグった。

E - NAND repeatedly

否定論理積とは何かが全くわからない(いや説明されてるから完全に理解はできてるんだけど)。括弧がたくさんあるけど、左結合というだけ。愚直は3乗。「結合法則を満たさない」とある通り、セグ木も使えそうにない(使ったところでだけど)。始点を固定すると、1乗で求まる。そこからもう少し考えると、そもそもこれf(i, j)は0か1なので、そこまでの計算結果が0である個数だけ持っておけばいける。区間たちの長さを意識して実装。なんもとっかかりがなかったのに、いきなり解けてしまい困惑。

F - Make 10 Again

とりあえず10までナップサックかなあと書き始める。何通りあるか数えてサンプル合わないけど、言われてみればそりゃそうで、これはサイコロを選ぶかどうかで通り数がめっちゃ増えている。包除とか分割数とか考えるけど、どれもできそうでできない。ていうか、できないものを「できそう」と思えてるのがやばすぎる。一生そのへんをグルグルして終わった。

(追記)たとえ思いついてもコンテスト中には無理だった。まず、基本となるDPは2値である。出目が決まっていたら、0以上10以下の整数について作れるかどうかを値として持つDPをすればいい。これをΠA通りについて考える。DPの値は2^11通りで表せるので、DPの途中経過がそれになるものが何通りあるかで改めてDPしていく。値の集まりが状態になる。確率ではなく何通りあるかを求めればいい。各出目について1倍ずつ遷移する。10以下であれば出目のぶんだけシフトしてorした場所へ。はみ出したらそこは消す(下位11bitで2^11通りに分けたものをそれぞれまとめて扱っている)。10より大きいときはシフトしても枠外へみんなふっとぶので同じ場所へ。0は常に作れるので、2^11ではなく2^10の状態でDPできる。ACしたけど時間かかった。このサイコロを選ばないときは出目0みたいな扱い?とか見当外れのこと思ってたし、上位を切り捨てるから状態が数として小さくなることもあるって気づかなかったし、まともに考える力がない(頭が悪いというよりは、DPをわかってない)。

G - Takahashi And Pass-The-Ball Game

いくつかの連結成分に分かれる。連結成分は閉路とそこへ入ってくる木たち。閉路から辺が出ることはない。トポロジカルソートしてシミュレーション的にDPできそうだと思ったが、影響範囲がバラバラのタイミングで終わってしまう。区間みたいになるから、(いもす法みたいに(コンテスト中いもすというワードは浮かんでなかった))2箇所印を付けてやればできそう。閉路内の処理がかなりきつそうでFに戻った。Fと違ってやればできる問題に見えたが、通してる人めっちゃ少ない。

(追記)functional graphで考えようとしていたが、実装があまりにも難しいためあきらめた。解説のダブリングは、確かに誤りは見つけられないがどうやって正しさを(感情的に)確認すればいいのかわからない。実装もけっこう時間かかった。実装が重くないことは解説を見てわかっていたが。奇数なら最初の1回だけ別に足しておいて進めて、偶数なら半分の問題に帰着させる。2つをまとめても、確かに次の場所にしか行かないし次の場所へ全部行っている。

本当に難しい。知らない世界なので。プロセカじみてきた。慣れてるからパッと見で人間離れした動きを簡単にできてしまうが、実はとんでもないレベルのことをやっていて、それと同レベルの知らない動きは全くできない。昨日、スレイヤーズ一挙放送のタイムシフトを見ようと思っていてこれが解けず見られなかったが、タイムシフトを見終わるくらいの時間をかけた。