ABC301

5完。めちゃくちゃ調子悪い。調子であってくれ。

DDoSによりB問題の提出が3分くらい遅れた。コンテスト終了が5分延長されたことはTwitterで気づいた。質問タブに通知は出ていたが、最後の5分には見ないね。

A - Overall Winner

なんかできそうではあるが一瞬で考察できなかったため問題文の通りに実装した。そしたら4分近くかかってゴミ。これはちゃんと考えるべきだった。実装に逃げてはいけない。プログラマーなんだから、こんな実装したくないと強く思うところだろ。

B - Fill the Gaps

これは入力を受け取りながらやれる。前の数との差の符号を求め、それを使ってfor文を回す。間を埋めてからA_iを出力する。

C - AtCoder Cards

かなり難しい。atcoderしか入れられないの途中で忘れて実装してサンプル合わなかった。順番は関係ないので、カウントする。同じ文字はSとTで同じ位置に置いて損しないので、Sにあったら1増やし、Tにあったら1減らす。これで差分がわかり、差の絶対値の和をとり'@'の個数以下ならOK(ここの考察が高度)。atcoderしか入れられないので、差が0でないときにそうじゃない文字だったらNo。

D - Bitmask

難しそうに見えたけど、落ち着いて考えたら上から貪欲だ。まず、'?'を0にしたときの数を求める。それがNより大きかったら-1。そうでないとき必ずN以下にできて、上の桁から順に?'を見てそこを1にできるか判定してできるならする。

E - Pac-Takahashi

18個もあってほんとにできるのかって感じだが、落ち着いて考えるとパーツは揃っている。スタートとゴールとお菓子のマス目は合わせて高々20個で、これらの間の距離を全て求めることはBFS20回で可能。そこからはグリッドのことを忘れてDPすればいい。

ここからが大変で、BFSもDPも実装が重い。両方を正しく書いてようやくACできるというコスパの悪さ。やりたくないと思ったけどやってしまった。本当に調子が悪い。やりたくないことをやれてしまう。

サンプルが合わず、ここでFGを見た。解けなくて戻ってきて、細かいところを大量に間違えていた。サンプルで何回も突き返され、通ったら提出してACだったけど、運がいいだけ。スタートとゴールの特別扱いが難しかった。まあ全部お菓子だとすればいいんだよな。定数倍はかなり悪くなるが。いや、ほんとにいいかは知らん。

F - Anti-DDoS

DPできそうと思いきや、同じになる文字が何であるかが色々あって、'?'だけというわけでもないので、対称性が崩れて包除とかも厳しそう。終了付近で、後ろから見るのを思いついたが、簡単そうにはなっているものの一番の困難は残ったまま。

(追記)解説とかを見て、眠い中どうにか理解を進めていく。すごいことに、寝る前に書きあがってサンプルが通った。提出してWAが3つあって仕方なく寝た。今日もコードを見直していたが全然わからない。解説のコードと比較して、あんなヒントだけから全く同じ処理をするコードを自分も独立に書いていて感動的ではあるが、どこが間違っているのかはわからなかった。で、これまでに現れた最初からある大文字の種類数の使い方が間違っていた。新たに大文字が現れたなら26種類ではありえない。25から26になったときに同じ大文字が2種類へ全部遷移してしまっていた。え、解説コードの「new_dp[27]+=dp[26];」のところ不要というか実行されることがないよね?それがあったから、解説コードと同じだと思ってしまった。実際は、現れた大文字を増やす前にカウントしてるから解説のは正しく動くんだけど。

G - Worst Picture

2点を通る直線は列挙できるし、そこに別の点が乗っているかもわかる。で、直線と直線の交点がわかれば、直線に対して交点を順番に見て最小値を出せば。整数でやるのむずそうだけど、doubleでもまあできるだろ。簡単そうだけど全然通されてない。計算量やばかったか?なんもわからん。