ABC228

6完。なんか久しぶりのアルゴコンな気がしてやや緊張。開始から30秒くらい、A問題の問題名は見えるが本文が見えないという状態だった。相変わらず前半が重い。簡単ではあるけど素早く通すにはかなりの腕力を要する。コンテスト前の感覚からすると、思ったより全然頭が回ってないなという感じだったが、前半が重かったからそう感じただけかもしれない(わからない)。

A - On and Off

S < T であればまあ簡単。T < S のとき、それを電気がついていない時間帯と捉える。ついてない判定ができるので逆にして出力すればいい。第一感(将棋用語)が24足すとかだったのでそこでも時間食った。実装もタイプ量が多い。考察部分がかなり高度。

(追記)SからTまで(mod 24でインクリメントしながら)ループを回して電気ついてる時間を配列でチェックしておけば簡単。提出が早いものを見ると、ループの中でXが現れたらYesにしていた。

B - Takahashi's Secret

いやこれBではないだろ。高橋君の他にN人いてそのうちの一人が友達X。1人にしか言わないので辿っていく。訪問済みを表すためにA_iを-1にする。現在の場所を更新してから-1にしないといけないので移動前の場所を保存しておく必要がある。もうかなり嫌。そしてサンプル合わず。-1になってる場所に来たこともカウントしてしまった。移動先が-1になるのがそもそもダメで、移動先の移動先が-1になっていたら訪問済みなのでそこへ行かずに終わらないといけない。混乱系の実装で、消耗した。

C - Final Day

点数は合計だけ持てばいい。自分にだけ300点加算されてどこまで順位が上がるか。元からボーダー内のときとそれ以外で挙動が変わりそうで怖かったが、そこは何も考えず3日目K位の点数以上になるかだけで正解できる問題だとわかって、もっと怖くなる。ACではあったけど。

改めて考えると、必ず順位は上がるというか下がらないんだな。これが自分だけ100点ダウンとかだと、二分探索で順位を求めるときに自分の扱いが難しくなる。まだよくわかってないけど。

D - Linear Probing

Nが入力で与えられない理由とか結局わからなかったな。見た目が変だけど内容自体は普通。第一感はstd::set。TLが4秒なのは気づいていたが、2^20で平衡二分探索木は体が拒否して、セグ木も思いついているのにそれに逆らってまでして書こうとは思わなかった。ただの最小値セグ木にインデックスを入れて、xを書き込んだらNに更新。まず現在の位置から端までで最小の残ってるインデックスの取得を試し、なければ全体でやり直す。言われてみればBITでもできる形してるなー。

(追記)いや最小値を大きいほうへ更新する必要があるからBITではできないのでは?

(解説を読んで)オープンアドレス法!コンピュータ将棋開発してて最初に置換表を実装したときこれにした。言われてみればそうだなあ。

E - Integer Sequence Fair

最初の行だけ読んで異常に簡単そうだと思うが、最後まで読むとMのクソでかい数乗パートが難しいのだとわかる。998244353は素数なので何かを998244353-1乗すると1になる。KのN乗をmod (998244353-1)で求めておけばいい。こういうのは以前yukicoderかどこかでやったことがあり、コーナーケースがあった気がして各変数に998244353や998244352を入れてにらんでみるが何もなさそうなので提出、WA。

事前にコーナーケースを探っただけあってWAの原因がしばらく全然わからない。ほんとに998244353-1でいいんだっけとフェルマーの小定理でググって互いに素の条件を見て気づいた。Mが998244353のとき何乗しようがそれは998244353の倍数なのに998244352周期で1に戻ってくるコードを書いていた。普通にフェルマーの小定理の適用ミスなんだけど、けっこう深い探索をしないと見つからないコーナーケースだった。2WAしてるのは、0を出力して終了し忘れて2行出力してたから(なんじゃそら)。

F - Stamp Game

2次元累積和は必要そう。青木君のスタンプは、高橋君のスタンプのサイズでトリミングしてしまっていい(コンテスト中はマス目からはみ出す心配をしていなかったが、大きいほうが得な設定だから問題なさそう)。高橋君が選ぶ場所を全探索することを考える。青木君の最善手が短時間で求まるか?青木君が奪えるスコアも2次元累積和でわかるが、指定された長方形内でそれの最大値を求める必要がある。こういうの、logにすら落とせないイメージある。もう少し考える。長方形(高橋君のスタンプの中で青木君のスタンプ(の左上隅)が動ける範囲)が規則正しく動くことを利用できないか。2次元なのが厄介だが、SWAGが思い浮かぶ。横方向のSWAGを、縦にH個並べて、そこから得た最大値をまた別のSWAGに入れて、みたいなことができないか?とりあえず実装を始める。頑張って1箇所も間違えないように書いていく。

サンプルが一発で通り提出してAC。これは嬉しい。今まで想像もしていなかったSWAGの使い方をコンテスト中に思いついて正しく実装できた。解説を見て、そういえば同じことがセグ木でも(logは付くけど1個だけで)できるんだな(これは全く気づかなかった)。

G - Digits on Grid

読んだだけ。まあ全問読めたのはいいこと。

H - Histogram

Fを通したあとはこちらをメインで考えていた。N-1個の仕切りを外していく感じで、外す個数を決めたとき貪欲でいいのかなとか。何もわからず。