ABC290

ABCDEGの6完。なんかGの未証明が通ったので久々の100位以内。序盤スピード出せたのもよかった。

A - Contest Result

Aは保存しておく必要があって、Bを受け取りながら和をとっていく。これ1分切れたのはえらい。

B - Qual B

メタい。希望する上位K人なので、Kを使い切ったらそこからは'x'に変換する。

C - Max MEX

3日連続mexだ!「順序を保ったまま」と変に攪乱してくるのはABCでも珍しい。K個選ぶので、答えは最大でもK。0からKまでチェックして、存在しなかった最初の数が答え。実装速度を優先してstd::setを使ったけど、今見たら長さKのvectorでいいな。

D - Marking

Dずつずらす。とりあえずDはmod Nとっておく。gcdをとりたくなるので求める。NとDが互いに素ならN回できれいに埋まるし具体的な場所も掛け算でわかる。となると、gcd単位で見ると一般の場合もN/gcd(N, D)回後には0に戻ってくる。0に戻ってきたら1ずれるのでまた同じことを繰り返す(0に戻るまではgcd(N, D)の倍数しか訪れないので)。さすがに難しく、冗長なコードになって混乱度が増す。

E - Make it Palindrome

かなり難しい。色々考えて、回文の真ん中を固定してみると、短いものから順に考えると数のペアが寄与する回数がわかる(どちらかが端に到達するまで)。ここで、全部のペアが異なる2数だった状態からどれだけ節約できるかという考え方をする。数は高々N種類しかないので、それぞれvectorに端からの距離を突っ込んでソートする。端に近いものから処理すれば、残っている全ての相手に対し自分の端までの距離が使えるので、掛け算でまとめて計算できる。あとは全部変更するときの回数から引くだけだが、それは全部同じ数だったときに節約できる量と同じなので同様に計算する。このソートを忘れて少し時間を食った。

F - Maximum Diameter

なんでわざわざ有限値になるって言ってんだ?と思ったらXの要素は正整数なら何でもいいのね。あまりにも解けない見た目なので何も考えることができなかった。ΣXが2*N-2になる必要があるってくらいしか。FとGを交互にやっていたが、途中からはGに注力した。Gを通してからもあまり考えることができていない。

(追記)頑張って解説を読む。普段は解説を1行ずつちゃんと追うなんて面倒でしないけど、今回は何もわからないので仕方ない。この行動が向いている状況だ。2*N-2になるの、必要条件なだけでなく十分条件でもあるのか。正整数だからね(そうじゃなくても正整数だけ考えればいいだけだが)。確かに次数2以上を並べれば達成できるし、次数1は端にしかならない。なんか感覚で全然わからない領域だ。X_1が2以上となる個数から数えるの典型ではあるけどこれもイメージしにくかった。実装は簡単だけど。

G - Edge Elimination

Kが2以上で木のサイズが10^18以下なので、Dは最大でも60くらい。どこかで切って部分木の中で調節することを考える、そうじゃないのを考える。要するに、最終的なX頂点の連結成分が根を含むかどうかで場合分けができる。根を含まない場合は、Dが小さい問題に帰着される。根を含む場合が難しそうだが、1回の操作でできるのは部分木を切り離すことのみ(既にいじった部分木を切り離すのは無意味)。部分木のサイズ分だけ減らすという操作だけ考えればよさそう。普通に考えると大きいほうから貪欲で行けそうだが、割り切れるわけではないのであやしい。ただ、K=2のケースでさえ大きいのを使わなかったら小さいのを2回以上使う必要があり、大丈夫な気もする。気になるので投げてみるとTLE。再帰で書いていたが、再帰した先では再帰する必要がなかった(根を含むとしてよい)。直して提出してAC。