ABC299

ABCDEGの6完。相変わらず調子は悪い。やる気がない。運良くGを拾えたので順位はよかった。

A - Treasure Chest

ちょっと前のABCのBだったかで出たやつの考え方が使える。前から見て'|'をカウントしておいて'*'が来た時点で'|'が1個かどうかで判定できる。

B - Trick Taking

少し考えて普通に場合分け。色TがなかったらTをC_1で置き換える。max_elementを使うには、色が違うものの値を0にする。

C - Dango

頑張って読む。レベル0はないというのが注意点。'o'だけでも'-'だけでもダンゴはできないので、'o'を数えることで場合分けしておく。すると、最長の連続する'o'の個数が答え(左右どちらかは'-'で区切られているので)。前から見て現在何個連続してるかを更新しながらその最大値を更新していけばいい。

Cを提出したら502になってた。自分が影響を受けたのはそこからの数分間だけ。

D - Find by Query

DDCC2020予選のEを思い出す。これは、答えが1個しかないと仮定して二分探索をすればよい。「初めて1が現れるのはどこか」の答えは2以上N以下なのでそこを二分探索。2以上N未満の範囲のクエリを使う。そこから1を引けば答え。

E - Nearest Black Vertex

白である必要がある頂点は全部白にする。で、他は全部黒にして損しない(距離がd_i以上であることが確定しているので距離は小さいほうがよく、黒が多いほど距離が小さくなる)。なので、BFSで塗ってBFSで確認する。

提出にwarningが出てて気づいたけど、全部白になったときreturnしてない。通る可能性高めのバグかな。

F - Square Subsequence

まずT1つの場合を思い出すのが大変。なんとか思い出す。で、2つの場合。開始位置と終了位置2個ずつを固定する?その場合、ダメな開始位置とかも出てくる。2個の位置を持ってそこで終わる部分列の個数を考える?その場合、追い越し禁止なので2つ目の開始位置とかを固定する必要がありそう。何を固定するのか色々ありすぎて難しい。

G - Minimum Permutation

後ろから見ていって初めて1からMまで揃ったとき、その位置を含めて左側が開始位置の候補。その中から、最小のもの(複数あれば一番左を選んで損しない)を選んで先頭にする。問題はその次からで、先頭の数を除いたものが初めて揃う位置を知る必要がある。かなり難しそうで頑張って考えたが、実は前からやってできる。

まず、M個の整数について全体で何個現れたかカウントしておく。そしたらループで出力していく。前から見ていって、これまでに使ってない数が現在の位置より右に揃っている状態が崩れるまでインクリメント。セグメント木を使い、その範囲で最小のものの位置を求める。その数を出力して次へ。

けっこうミスがあった。個数を減らしていって揃ってる状態が崩れたら、揃ってる状態に戻してからbreakしないと壊れる。最小を見つけるときは、既に使った数を除く必要があることを忘れていて困ったが、既に使った数である間ループしてればよかった(全体で高々N回しか除かれないので計算量は大丈夫)。頭もゴチャゴチャしててあやしかったけどAC。