ABC262

5完。だいぶARC寄りに感じた。問題は面白いけどこういう内容だと緊張してしまう。

A - World Cup

1月は6月より前。その年が来るまでインクリメント。

B - Triangle (Easier)

直接結んでる辺ってことだよね。隣接行列を作り3重ループで全探索。問題の内容はABCだが、文面がABCっぽくない。

C - Min Max Pair

難しそう。a_i=i, a_j=j または a_i=j, a_j=i のパターンしかない。前者を考えてみると、場所と値が合ってるのを数えればいい。後者は、よく考えると対応する相手が高々1個しかない。その1箇所を確認すればよい。実装で、わかんなくなって慌てて1-indexedに書き直したけど、解説みたく1引けばいいよねー。それを考える勇気がなかった。a_iの制約を見落としていて10^9がありえると思っていたので1引くのが不自然に思えてしまった。

D - I Hate Non-integer Number

いきなりABCっぽくなった。何個選ぶか固定してDP。解法を思いついた段階ではDPの計算量がなかなか見えない。個数が多いほうからやればin-placeでできて楽。4乗だが定数倍で速いやつ。

E - Red and Blue Graph

ちょうどK個というのが無理。色で二部グラフにしてみたり、木で考えてみたり、1頂点の色を変えたときの変化を見たり。非連結もあるけどどうすんの。なんか天才すれば解けるんだろうなあと思いつつ、自分は思いついてないので不快。K個配置して移動するとか考えて、トイレに行って、そこで気づく。1頂点の色を変えたとき隣の赤と青の個数で辺の数が変化するけど、どう分割しても偶奇は一緒じゃん。次数が奇数の頂点を偶数個赤にする。偶数を全探索する。

F - Erase and Rotate

操作の順序がそんなに関係ない。削除しかしないなら、セグ木で先頭から貪欲に削っていく。削除で掘れる位置とrotateで持ってこれる位置の範囲で最小値を求めておく。それが答えの先頭になる。rotateするとすると、その最小値を先頭に持ってくることが確定。セグ木で同じことをすればいいか?と思っていたら先に削除しておけば節約できるのね。最小値の探索範囲は変わらないけど。この時点で残り5分くらい。その範囲(元の列で最小値より後の部分)は好きに削除できる。全部削除する可能性もある。そうでないとき、それより後の辞書順最小を求めその先頭より小さいものがあればいくつでも昇順に残したい。無理。

(追記)当時の自分がどう考えてたかわからんけど、たぶん上の文章はそれをかなりよく表現しているんだろうな。少し考えて解説を見るともう解説が正しいとしか思えなくなる。こうなると逆に証明しづらくて困る。rotateしないなら簡単。実装は、せっかくなのでSWAGを使った。rotateするなら、先頭にするための可能な最小の数を持ってくる。余計にrotateして削除しても回数を消費するだけなので得しない。つまりrotate回数はこれで決定。あとは、解説にあるように、末尾からM個持ってきたなら最初のM個は回数にカウントしないようにして、rotateしないときと同様に貪欲。ただ、同様にできないので困る。かなりややこしい。残り回数が0であっても1個追加して1個取り出すという操作はできるようにして、1個取り出すときに回数を戻して、その前は残り回数が負のこともあるがこれが負でなくて全部追加してるなら終わり。rotateしただけで残り回数が負になることはない(それ自体は当たり前だが、自分の実装だとそれが見えにくかった)。ここ数日でけっこうupsolveしたけど、実装力の低さを感じている。自分はプログラミングが得意だと思っていたけど、慣れてないコーディングは信じられないほどできない。