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

脳log[20230909]



2023年09月09日 (土) [AtCoder] 今日は ABC319 があった。コンテスト成績証自分のすべての提出。ABCE の4完だけど水パフォで軽傷だからへーきへーき。以下 E までの精進とふりかえり。■A 問題「Legendary Players」。えっと、冠の説明いりませんよね。知らなかったので役に立つ情報ではあったけど、余計な時間を使ったぜ。前にも書いたけど(20230729)、これはコピペ活用術が問われている。ヒアドキュメントで埋め込んで行単位でスプリットしてできた2要素配列の配列を to_h した(後知恵だけど、フラットな偶数要素の配列を Hash.[] メソッドの引数リストに展開して呼び出してもよかった)。残念なのは丁寧に整形した人よりも提出が遅かったところ。■B 問題「Measure」。読んでも理解できないので書いてある通りに実装した。ささやかな工夫は N の約数 j をループの外側で列挙したこと。■C 問題「False Hope」。正解者数が D 問題より少ないみたい。制約付きの順列数え上げなんだけど、全列挙して許されるサイズなので考える前に全列挙した。制約は多くても8個で、ある列にある数字が重複ありで AAB の2種3個のとき、A→A→B という風に同じ数2つを最初に出してリーチを演出すると高橋くんをがっかりさせてしまう。そういうケースを除外した。■D 問題「Minimum Width」。解けなかった。二分探索なのはわかる。その中で累積和を二分探索したのが良くなかった。累積和を前から順番に調べることで log を落とすことができる。これは Pairs の教訓(20230725)。しかし生かされなかった。そして実は累積和いらなかった。余計なことして無駄な時間を使って TLE を出したのみならず AC を逃した。つらい。■E 問題「Bus Stops」。Ruby で時間内に通せたのは1人だけ。それは自分ではない。クエリに対して線形時間ないしは対数時間で答えが出せないといけないがどうするか。X+Y+T.sum は必ずかかる固定の時間。停留所で生じる待機時間をどうやってすばやく数えるか。太字でこれみよがしに書かれている「ここで、1≤Pi​≤8 が制約として保証されます」がどう活用できるのか。最初は8×8の 64 通りに qi+X を分類して答えを求めておけばいいかと思った。でも足りなかった。1から8までの LCM である 840 通りであれば足りた。だけど 840×N≦8400万は Ruby にはつらい数字。D 問題に続いて E 問題まで答えは出せても TLE というのは残念すぎるので、先日の精進(20230831)にならって C++ で提出したら 624 ms で AC だった。制限時間は3秒。Ruby でも2秒を切れるみたいだけど、どんな考察が求められているのかまだわからない。■F 問題「Fighter Takahashi」。薬を飲む順番を総当たりして許される制約。敵はポーションのまわりに集約できる。ポーションは直列と並列に並べられる。あとは効率良く総当たりしたいけど、うまく書けなかった。DFS でやるんかな。■■■F 問題。すでに飲んだ薬の集合をキーとして、倒せる敵をすべて倒したときの強さの最大値を記録したものを状態とする。次に飲む薬を選び、倒せる敵をすべて倒し、記録する。これでいけると思う。DFS だと飲んだ薬の集合ではなく薬を飲んだ順番を区別してしまうので、計算量が危険? 10 の階乗はだいたい 370 万やからいけるやろって思ってたんだけど、案外遷移に時間がかかる? つまり、倒せる敵を倒しつくすのに(※薬の倍率が1以上なので薬を飲む前に倒せる敵を倒さない選択肢はありません)。プライオリティキューを使って、敵の数×log(敵の数)<5000。あっ、これはいけない。状態数を 1<<(薬の数) (1024 以下) に抑えてやっとなのだな。■ところで、Ruby ですでに AC になっている提出 #45433698 を答え合わせに使ってデバッグをしていたのだけど、こういう No ケース (4つの頂点が1列に並んでいて、1の直接の子が強さ9の敵) に Yes が返ってきて困ってしまった。答えが2択だとこういうこともあるかな。こちらは大丈夫みたい>#45434962 (require があって実行がやや面倒)。■提出 #45461169 (AC / 1755 Byte / 94 ms)。通った! こんなに不安だった提出はそうそうない。Octopus (20230902) とか? 提出をためらっているあいだに変数にコメントをつけたりなんかして。しかも2桁 ms なのが嬉しい。1.7 KB も文字を打った甲斐がある。ちなみにプライオリティキューは使ってないよ。敵は木構造を持って整列しているので線形時間のマージ操作を書いた。敵を倒すときも線形時間で走査する。これは5問目の橙 diff AC。ABC の高難度評価は当てにならないらしいけど、相対的に十分難しいのはたしか。