ABC263

6完。Eがガチガチの典型だけど、CD辺りは逆にアドホックな感じもする。Fはまだわかってない。Gは高度典型というイメージ(まだわかってない)。

A - Full House

自分が解けるかという意味では簡単だが、ちゃんと詰め切る実装難度はA問題としては高いと思った。各整数が何回現れたかをカウントして降順ソートして3,2であればOK。

B - Ancestor

Nから親へ移動するのを繰り返し1に着いたら終わる。何回移動したかをカウントしておいて出力。

解説はDPで草。それもちょっと思ったけどさすがに選ばなかった。

C - Monotonically Increasing

Nが大きそうに見えるが、Mが小さいので出力する行数はそんなに大きくならない。こういうの、計算量の見積もりをするのがベターではあるけど、2秒で出力できないような量ではないことが半ば保証されてるわけで、今回はあまり考えずに出してしまった。変数減らすために末尾からやろうとしたが、辞書順なので先頭からに書き直す。現在の深さと使える最小の整数を渡す。最後まで狭義単調増加にできる上限を計算してそこまでループを回す(そうでないと計算量が出力の量と同じオーダーになることを保証できない)。末端で出力。

解説のnext_permutation頭いいなあ。

D - Left Right Operation

左からx個をLで塗りつぶす。右からy個をRで塗りつぶす。重なったら、重ならない別のケースと同じになるので重ならないとしてよい。各xに対し総和がどのくらい変化するかは簡単に計算できる。yを決めたときの最小は、重ならない範囲のxの変化量最小のやつが与える。というわけで、変化量の累積minを作っておけばいい。yがとる値はN+1通りあるので注意する(xもそうだけど累積和が長さN+1になるのはいつものことなので)。

E - Sugoroku 3

はみ出したらどうすんのって思ってたけどはみ出さない制約だった。ABC189のFを思い出す(え、今気づいたけど問題名「Sugoroku2」じゃん)。今回は誤差を気にする必要がない。1回サイコロを振ると期待値が1減るはずなので、方程式が立つ。区間和がわかればいいのでセグ木で解ける。もう少し考えると、回数の期待値ではなくその累積和を持つようにすればそれだけで済む。累積和の最初の位置s[N]は0、s[N-1]も(ゴールからゴールまでの回数なので)0。あとは数式をいじるだけ。計算結果をコードに写して動くかどうかドキドキ。

そうか0が出続ける回数の期待値はすぐ求まるのか。

F - Tournament

下からやっていくか、分割統治法か。どちらも、優勝者の勝ち数が確定しないのに決めようがない。勝ち数は 0 1 0 2 0 1 0 3 みたいに分布するので、ソートとか貪欲に割り当てるとか考えたけど無理そう。順位表を見て再帰(いかにもTLEしそう)を思いついた。分割統治はさっき無理って言ったけど、優勝者の勝ち数を指定(8人のトナメなら優勝者は3勝だけど5勝扱いにしますよとか)して再帰すれば求まる。問題は計算量だが、手元でCを全部0にして回して4秒くらいかかった。通る可能性がないではない、くらいの感触。そこで、メモ化再帰を思いついた。これで、何もわからなかった計算量に明快な上界が与えられた。logが2つ付いてる感じだけど、通りはするでしょう。一応呼び出し回数とか数えて、めっちゃ減ってるのは確認した。提出してWA。WAということは、何か間違ってる(当たり前っぽいけど、計算量の見積もり以外のミスがあるってこと)。優勝者の勝ち数の指定が、さっきの3勝と5勝のやつで言うと負け側が4勝になってたけど2勝が正しかった。残り30秒を切っていた。マジでギリギリ。PC画面の22:39という表示を見ながら「これ何秒なんだろ」と思いながら実行ボタンを押していた。

G - Erasing Prime Pairs

正面から行くか、フローか、線形計画法か、と思っていた。現実的に解けそうなのがフローしかないけど、無理。