ACL Beginner Contest

5完。BとEで、本質的でないミスをしたが、それは問題の難しさに圧されたからなので、実力の表れだ。それはそれとして、こういうどうでもいいミスは得るものがないので残念感ある。

A - Repeat ACL

for文を回すだけだが、3文字のものを3回繰り返す(同じ3)サンプルしかないのは不安になる。

B - Integer Preference

まず、区間の開始位置がa <= cとなるようにswapしておく。サンプルがそうなっているのでswap処理の確認ができないなと思った(サンプルを生かすため逆にすることも考えたがさすがにこんがらがるデメリットのほうが大きい(手で逆にしたサンプルを作るという方法もあるが時間がかかる))。閉区間のまま考える。b < cのときNo。そうでないときを考えると?あれ、常にYesじゃん。このことを知らなかったので「本当にそうか?」とかなり長く考えた。今考えると、cが[a, b]に含まれるかってだけなんだな。まあ知らないとこれは時間がかかる。

1WA。10^18なのは最初に見て知っていたが、問題があまりにも難しいため忘れてintで提出してしまった。提出前にしっかり考えたので、WAを見た瞬間原因がわかった。

C - Connect Cities

ただのUnionFindに見える。問題をちゃんと読むと、やはりそれっぽい。連結成分の個数を得て1を引けば必要な道路の個数がわかる。UnionFindでrootが何種類あるか数えたけど、uniteしたかどうかboolで返すようにしておくとこういうときに便利なんだなと今気づいた(つながるたびに連結成分が1個減る)。

D - Flat Subsequence

そんなこと本当にできるの?って感じでかなり難しそうなので、DPを疑う。A_iの最大値である300000が入力として与えられないのがつらい(ミスらないように埋め込む必要がある)(実際の入力から最大値を得るのはこの問題設定だとさすがにやりたくない)。差の絶対値がK以下ということで扱いにくそう。この位置まででの最長と考えると最後の位置にある要素を使うかどうかで困るけど、ちょうどこの位置で終わる最長を考えればいいと気づいて解けた。maxのセグ木を使い、左から見ていって、最後にこの範囲に来たインデックスを、と考えて間違いに気づいた。知りたいのはこの範囲の最長だ(セグ木とは別にdpテーブルも持ってたけど必要なかった)。

これでACできたが、今気づいたけどupdate時に何も考えずそのまま上書きしてた。確かに、同じ数なら後に出たもので終わる最長シーケンスが短くなるわけはないのだが、それを考えずに提出してしまった。最初は左から見ることを利用した方法を考えていたのに、それが必要ないとわかると全部忘れてた。

E - Replace Digits

遅延セグ木に何が乗るかの感覚がないから、実際にいくつかの関数を書き上げることでしか判定できず時間がかかる。今回は普通に書けたから余計な時間はかからなかったけど。10000とか11111を998244353で割ったあまりをvectorに入れといて、セグ木には0はパディングしないで乗せる。あまりと桁数を持つ。22と4444を合わせて224444にする感じ。文字列は反転させると書きやすい。元の数字と関係なく塗りつぶされるので遅延させる部分の更新が意外と楽。時間はかかるし本当に書けるか不安も大きいけど、結果的にはちゃんと書けた。

さて、11111111しか出力されない。更新が全然行ってないみたい。更新する関数も1回も実行されてない。ここで15分くらいロスした。(l--;で0-indexedにしてから)l = n - l; r = n - r; と反転させたのに、lとrをswapしてなかった。虚無デバッグ本当に時間の無駄なのでやめたいが、問題で扱う概念が難しいとなかなかそうもいかない。

F - Heights and Pairs

身長が無次元量なの草。とりあえず各身長が何人いるかカウントしておく。しばらくいじって包除原理に狙いをつけたけどできなかった。