AGC024

AとCの2完。仮にBを考えていた時間でBが解けていたとしてもパフォーマンス1800行かないくらいなので、なんだこりゃ。Cを通したとき「人権を得た」と思ったけどそんなことなかった。青パフォ(1600以上)取れなかったのはすごく久しぶり。3月から競プロの時間を削ってぷよぷよやってたので、ようやくその成果が出てきたか。いやいや、1回の結果では何もわからんでしょ。ぷよぷよで3連勝したからって自分のほうが強いかどうかは全くわからないのだ。まあしかし、ここ最近パフォーマンス1900超えを連発できてたのはかなり謎。

A - Fairness

各整数がどう変化していくかに興味を持った。Kはすごく大きいんだけどね。3回操作を行ったところまで計算して、差が規則的なことに気づいた(ここまで差を計算してない)。ACまで7分なのでけっこうかかっている。Unfairってソースにとりあえず書いたのとか裏目すぎて「ああこういうゲームじゃないのかー」という感じ。最初から差にだけ興味を持っておけばよかったのだが、よくわからん。結果論にも思えるし、俺は何か間違っていたのか?

B - Backfront

どうもカッチリ考えることができない。先頭にしか移動できないとしても(制限してより簡単な問題に変えても)この貪欲でいいことの証明が浮かばない。さすがにこれは正しいんだろうけどなあ。それをとりあえず両側からやる。BITを使った。今度は、先頭に動かしたあとで末尾に動かすという制限でやってみる。なんかO(NlogN)で行ける気がしたけど、結局できたと思ったのも勘違いで、できなかった。二分探索を考えたときは「これでO(N(logN)^2)は複雑すぎる、他に何かあるんじゃ?」と考え直してみたが、何もできず。BITに最小値を持たせることできたっけ、使い方に制限を加えればできたはず、とか考えてた。まあセグ木を使えばいいんだけど。2,4,1,3というケースで、1を処理したら逆から見たときに2より小さいものが2の右から消えてるんだよね。左右から見たときそれぞれの処理すべき数に印を付けそれぞれどこまで担当するのが最善か、みたいな。無理。
Cが解ける場合でも、さすがにBは最終的に解けるはずと時間を投入。50分弱考えてCに行った。
Cを通して帰ってきた。逆に考える。A_iとiをペアにしてA_iでソートしてiを見る。そのiを、端から好きな場所へ動かして何回で1,2,3,4,5に戻せるかを考えればいい。x,x,1,y,y,y,8,zみたいなとき、xとzは動かす必要がある。yはソート済みであればそのままでいいが、そうでないとき、最も長いソート済みの連続した部分列を残して(xzを処理したあとで)1や8を動かして削り取り再び中へ入れればいい。その1や8を動かすパートが片方しか必要でない場合もあるので面倒だ。さて、1と8が順に並んでいないケースに気づいた。残り15分。ちょっと修正できなかった。

C - Sequence Growing Easy

わりと限られた列しか出現しなさそう。入力例3を見ると1,2,2という部分がある。そういうのもあるのか。これは右の2を作ってから左の2を作るわけだ。適当な例を作って手を動かしてみる。1より多く増える場所があればダメだし、なければ作れるかな?思ったより作れる範囲が広い。後ろから考えていけばよさそう。一番後ろの正の数を作ったらそれを反映(3を作ったらその前の場所に1,2,3みたいに数を入れる)させて次へ、これでO(N^2)で解ける(もっと速いかもしれないけど)。反映にO(N)かかるのがいけないのだが解消できるだろうか。いやその、できそうなんだけど、オーダーが変わるような魔法があるとは思えない、魔法なしにオーダーが削減できそうなので怖がっているのだ。まあいけそうなのでそのまま実装、あっさり書けて、あっさりサンプルが通る。1分くらい見直して提出、AC。Bへ。