ABC311

6完。苦手そうなセットでまずまずの成績はかなりラッキーかも。

A - First ABC

出現フラグを長さ3の配列で持ち、3つ揃ったかを毎回愚直にチェックし、揃ったら出力して終了。文字の種類数が多い場合は、出現した文字の種類数をカウントしておくとよさそうだが、今回はそこまでしないほうが速く実装できる。

B - Vacation Together

'x'があったらダメな日として印を付ける。付け終わったら印がない区間の長さの最大を求めるだけ。現在何連続かの変数を更新しつつ、その最大値をとればよい。

C - Find it!

どんな350かと思ったら先週のGじゃん。自分の提出を見に行ったけどその方針は捨てたのだった。書きかけのコードは保存してあるけど、まあ新規に書く。見た目よりは簡単そう。連結成分の個数で何が変わるかとか考えるけど、落ち着け。どこからスタートしても行き止まりになることはない。ということは適当な頂点からスタートして必ず閉路が見つかる。同じ場所に戻ってきたら、その場所は閉路に含まれるので、そこから改めてスタートして戻ってくるまで頂点を列挙すればいい。

D - Grid Ice Floor

番兵置いてくれて助かる。制約を見ると3乗が間に合うので普通にBFS。最初に書き上げた実装は、途中で曲がれるようになってたし(氷設定どこ行った)、書き直しても無限ループでデバッグにめちゃくちゃ時間かかった。3乗に収めるポイントは、ちゃんとBFSをすることで、BFSでは同じ場所を2回以上キューに入れないことがだいじ。今回は、距離がわかっていてもキューに入ったことがない場所が存在するやつだったので、いつもと様子が違って間違えてしまった。明らかにもっと速い解法がありそうなのも実装の難しさに寄与している。

E - Defect-free Squares

最初全然わからなかった。2次元累積和を使うのは間に合わなそうと思ってたけど、正方形の左上隅を固定すると二分探索できるやんけ。3000*3000にlogも付くので想定解ではなさそう。まあサンプル4に大きいケースがあって手元では速いので通りはする。二分探索の範囲を丁寧に決める必要があるが、あとはやるだけ。2次元累積和書くの久しぶりで瞬殺できなくなってたし、-1付ける場所間違えてサンプル通らなかった。

F - Yet Another Grid Task

あるマスを黒にしたら、右下へ三角形の領域を塗りつぶす。下から決めていくことを考えていたが、重複を避けてカウントするには結局左上の領域も気にする必要があり、上からやっても同じっぽい。表面に出ている三角形の頂上部分を考えると、これは1次元に分布するっていうかN個以下。左下からDPできないか(かなり難しそう)と考えていたら、普通に左から簡単にDPできて草。列は、上から見てある場所から全部黒(それまでは全部白)になっている。その位置は高々N+1通りで、しかもそれより左の列の状況は右の列に(美しいグリッドかについて)影響を及ぼさないっぽい。ということでDPできる。更新には和が必要なので下から足しながらやっていけば高速。境界はやや面倒。最初は、黒が始まる位置の可能な一番低い場所を保持していたが、現在の横位置でのそれだけ調べておけばいいと気づいてそうした。現在の横位置の情報は使えよ(使い忘れてサンプル合わなかった)。

G - One More Grid Task

けっこう通されてるけど、青で通してるのは中国が多そう。増えるのと減るのの積で、三分探索もできない形。わからなかった。

(追記)軽く解法ツイートとか見ても、最大長方形がわからない。解説をちゃんと読むと、確かに解けてそう。アルゴ式の「ヒストグラム内の最大長方形」を見てスタックを使う解き方もやった(なぜか遅い)。不慣れな処理が出てくるとめっちゃ時間かかる。