ARC163

3完。パフォ2105は上出来。よかった。Dは歯が立たなかったけど。

A - Divide String

まてよ、これ例えば4つに分割できたとして、後ろの3つを結合しても損しないね(辞書順で大きくなるだけ)。2つより多く分割できるなら2つに分割することも可能。つまり2つに分けるのだけ全探索すればいい。

これはいわゆるギャグか?軽めのA問題いいね。

B - Favorite Game

A_1とA_2が特別扱いされてなんやねんという感じだが、どちらも同じように操作できることを表すならこうなるか。A_1とA_2以外を動かすくらいならA_1かA_2を動かしたほうが得。ということで、いくつ動かしたときにいくつ増えるみたいのを前計算してやろうと思ったけど、そもそもA_1とA_2の大小関係が逆になってることもあり別の方針を考えたい。Aはソートしていいのでしてある。ここでしゃくとりというか、単に幅Mで全探索できそう。ややこしいけど、幅Mの区間がいくつかあって、最適解はそのどれかを必ず含んでいる、よってその区間を取る最小操作回数を求めるのを全部やって最小値をとればいい。これは、その区間を含むように(必要なら)広げればいい。混乱したけど最後はきれいに解けた。

C - Harmonic Mean

面白そう、怖そう。1は1/1でできる、2はできない(大きいほうが1/1も1/2もダメなので)。10^9という上限がないなら、1/2+1/4+1/8+1/16+1/16みたいにいくらでも長くできる(最後の1/16の被りは1/2=1/3+1/6を使ってバラす)。他のやり方がないか、実験をする。1/a+1/b=1/cかつgcd(a, b, c)=1となるものを列挙する。すると、1/A=1/(A+1)+1/(A*(A+1))というなんか有名っぽい式が見える。とりあえずこれを使って、数が被らないようにバラしていくのを試す(500まで全部できれば通るので)。適当に選んで被らないならバラすのをN個になるまで繰り返すという処理がなかなかきれいに書けなかった。ここで時間を使うのはいつものことで、面白い実装ではあるけどどうしたら時間を短縮できるのかというところ。どうしようもなさそう。全部できてるっぽいので提出してAC。

なんかテストケースが500個あるの忘れてたな。手元でも500通りやって時間はかからなかったけど。人によってやり方が違ってるみたいで、こういうの好き。

D - Sum of SCC

(追記)不可能に見えるならDPで解ける。今回もそうだったけど、不可能どころか競プロの問題にすら見えてなかったからなあ。解説を読む。強連結成分分解したときのDAGが分岐してたらと不安になったけど、強連結成分間に必ず辺が存在するので全順序になっている。「頂点番号が小さい方から大きい方へ向けられた辺」の個数についても、頂点番号順に追加するDPだからカウントできる(ナップサックに似た見えにくさだ)。グラフ(ここでは辺の向きの集まり)も、ABの2種類のラベルの付け方も、元々別だったものが合流することはない(だからDPできる)。ACした問題の中でもトップクラスに難しい。これを126人通していて、化け物たちと一緒に戦っていることが改めて実感されるし、writerの異次元ぶりの片鱗が見える。