AtCoder Beginner Contest 285

 A~Fの6完

tokuminiさんのAtCoder Beginner Contest 285での成績:198位
パフォーマンス:1999相当
レーティング:1910→1919 (+9) :)
#AtCoder #ABC285 https://atcoder.jp/users/tokumini/history/share/abc285?lang=ja 

 ギリギリ黄色パフォーマンスに届かず。

A問題

 画像を見ないと解けない問題、ChatGPT対策来たな。

 念の為 a > bの場合にスワップする処理を入れたけど制約を良く見ると不要だった。

提出

B問題

 意味がわからなくてかなり時間がかかった。1-indexedで書かれている問題文を0-indexedに翻訳することができなかったので、文字列の先頭にダミー文字を入れて1-indexedで扱うようにした。

 出力するのは i = 1,2,\dots, N - 1までなのに、i = Nも出力してしまい1WA。サンプルの確認を目視でやっているせいでこういうミスが出る。

提出

C問題

 26進数として考えるのは良いとして、1問目からなので答えが1ズレるかもとか考えたけど、サンプルがちゃんとあるので実装してみて合わせるということで。

提出

D問題

 サイクルができるとダメだろうというなんとなくの考察でUnion-Findをやりにいった。微妙に正当性に自信はなかったけど、間違っていたらWAが出てから考えれば良い。

提出

E問題

 休みと休みの間隔が決まれば、その間の生産量の和は O(1)で求めるな〜というのが初手(事前計算はしておく)。

 なので

 
dp_{i,j} = 「i日目まで考えて直前の休みがj日目であるときの、jより左側についての最小値」

というものを考えたけれど、遷移は「直前の休みが k(\lt j)であるところから」であり、 O(N)かかるのでこれだとダメ。

 ちょっと考えると「i日目まで考えて」という部分が要らないなと思ってそれで高速化できる。答えを求めるときに、jより右側を計算することを忘れないようにする。

 競プロのために競プロをやっているとこういうのが自然と解けるようになる。

提出

F問題

 「S[L:R] は文字の昇順に並んでいる」だけで良いのかと思って、各文字の出現位置をstd::setで保持する実装を提出して1WA。

 よく考えると「各文字の出現文字数が...,0, 0, 1~最大, 最大, 最大, 1~最大, 0, 0,...」という感じになることも必要だと思って、これをどうするかちょっと悩んだが、最近std::setの上位互換であるtreeというのを見かけたなぁと思ってそれを使いにいった。

 しかしもう一度WA。クエリタイプ1のとき、文字列S自体を変更することを忘れていた。同じ位置を2回変更するようなテストケースを考えないとどうしてWAになるのかなかなかわからず、とても時間がかかった。もったいない。

提出

G問題

 手を付けた時点で残り11分くらいだった。見た目がもう「フローで解いてください」と主張しているのでそれっぽいものを考えるが、まとまりきる前に時間切れ。F問題で妙に時間を取られていなければ可能性があったかどうか。

サンプルが合わないことはわかっていたがなんか出してしまった提出