ABC298

5完。全体的に難しかった。昼間かなり頭の調子が悪かったけど、ABCは大丈夫だった。と思ってたんだけど水パフォ相当なんだよねえ。Fが本当に難しく感じられる。やはりこの数か月は本当に落ちてるのかな。たまたま苦手セットが連続して来るというのも普通にあることだけど。

A - Job Interview

oとxが一つでもあるかをそれぞれチェック。

B - Coloring Matrix

完全一致をチェックしてサンプルが合わなかった。(回転方法が書いてあるとはいえ)回転だけで難しいのでまさかここまで難しいとは思わず誤読。A_(i,j)が1のときだけ見ればよくて、そこでB_(i,j)が0だったらダメ。回転させながら4通りの中で一つでもOKなやつがあったらYes。

C - Cards Query Problem

かなり難しい見た目。よく見ると、(箱とカードはまあまあ対称なので)それぞれやるだけ。ただ、2*10^5個のsetは持ちたくない(それでも間に合うことは知っている)。出力するのが2*10^5個以下ということで、この個数を毎回ソートしても間に合う。クエリタイプ3が心配だが、削除回数はO(Q)だし、これも大丈夫だと思った(今考えると、ソートサイズの合計が(出力量に対して)O(Q)増えるだけなので問題ない)。

D - Writing a Numeral

これもクエリ問題。末尾を削除すると誤読。998244353の倍数になったときが怖いが、まあ大丈夫なので大丈夫。dequeで文字列を管理する。末尾に足すのは10倍してxを足すだけ。先頭を消すのは、何桁かわかってないといけない。追加するときに10倍、削除するときに1/10倍して管理しておけば、最上位の桁の数にそれを掛けて引けばいい。10の逆元も前計算しておけば高速。SWAGをちょっと思ったけど、桁数の情報要るから大変そう。

E - Unfair Sugoroku

DPするだけだけど、非対称なゲームは不慣れだ(手番から見た勝率でやろうとしてしまった)。高橋君の位置と青木君の位置と手番から(高橋君の)勝率が得られるテーブルを用意する。まず片方だけが位置Nのときは手番側が勝率1(これがいわゆる「DPのタネ」)。両方が位置Nになることはない。そうでないときは、後ろからDPできる。PとQの逆元は前計算しておく。解説の累積和はなるほど。

21:44にEを提出したとき画面の遷移が遅く、Fは開いたけどGが開けなかった(数分後にリロードしたとき開けた)。コンテスト中に問題文が読めないのは悲しいからね(だから行動を変えるというわけではないが)。

F - Rook Score

雑に考えると、行の合計の最大と列の合計の最大の和。ただし、交わる場所に正の数があるかどうかで変わる。ある場所はN個しかないので全探索できる。ない場所の最大がわかればいい。ここで、最大の同士が交わった場所だけ見ればいいと勘違いした。そういう場所はN個よりずっと多い可能性があるが、ない場所を一つでも見つければいいので見つかるまで探すだけで探す回数はO(N)になっている。サンプルが合わなくて勘違いに気づく。いや難しい。

行の合計と列の合計の和を大きい順にN+1個列挙できれば解けている。しかしその方法がわからない。かなり考えたが、仕方なくlogを2個付ける方針で頑張る。二分探索をするが、greaterとか付けてとにかくややこしい。小さい順とやることは同じなのに、逆になっていると(脳への)負荷のかかり方が全然違う。二分探索をして、だんだん小さくしていって和がそれ以上になるペアが初めてN+1個以上になる場所を見つける。で、ここからもやや難しくて、そういう行と列のペアはN+1個どころじゃなくすごく多いかもしれない。そこで、閾値を等しいやつだけ別に処理する(等しくないやつはN+1個以下なのでOK)。そういうのが大量にあっても、N+1個チェックすれば必ず正の数がない場所が見つかるので大丈夫。時間ギリギリで「バグってなければAC」って思ったけどしょーもないバグで提出もできなかった。これは仕方ない。実装があまりにも重かった(面倒とかじゃなくて考えることが多く本当に大変な実装)。