ABC160

5完。

A - Coffee

一瞬、3文字目から6文字目まで全部等しいという風に読めてしまった。

B - Golden Coins

500円のほうが効率いいのでそっちから。嬉しさは金額の高々2倍なのでintに収まる。整数で割って掛けてあまりを5円にしてという感じ。

C - Traveling Salesman around Lake

出発地点がどの家でもいいというのは4行目で初めてわかるので、同じ道を2回通るようなケースもありそうという感情がどうしても残ってしまう。そんなケースはないと気づくのに少し時間がかかった。気づいたら簡単、なはずが、コードを単純にするためにa[n] = a[0];と書いてKを足すのを忘れてたり、a[i + 1] - a[i]のminを求めていたり(正しくはmax)、最後にKから引いてなかったり、サンプルが合わないまくって酷かった。

D - Line++

5分くらい「難しいなあ」と思いながら考えていたら、なんとO(N^2)でいい制約だ。いかにもO(NlogN)で解いてくれという見た目だったのでうっかりした。2乗でいいならBFSするだけだ。が、こういうBFSはライブラリを持ってない(持ってた、BFSで検索したけど幅優先探索って書いてあった)。ダイクストラでも通るだろうけど、TLEの不安を持ちながら提出するのはあまりにも嫌なので、普通に書いた。それに近いコードは持ってたのでまあそこまで大変でもない。実装10分。

E - Red and Green Apples

降順ソートして、無色のリンゴを何個使うか0個からmin(X + Y, C)個まで試せばいい。無色を増やすとき、捨てる赤緑は貪欲に小さいほうからというのをまず思いつくが、証明ができない。とりあえず実装してみる。もう少し考えると、赤緑で一番小さいものは必ず末尾に露出している。なにしろ大きい順に並んでいるものを後ろから見ているので。末尾の値が赤と緑で同じでも結局はその末尾の2つが最小なのでどちらを先に使っても関係ない。ということで実装して提出、1ケースだけWA。片方の色がなくなったときの処理を(y < 0 || p[x] < q[y])とやっていたが、x < 0のケースでp[-1]にアクセスすることを見落としていた。ここは1行で書くのがかなり難しいと感じた。

最初証明ができず、のちにひねり出した説明もすっきりしていなかったのが敗因。脳のリソースをそっちに持っていかれた。解説PDFが簡潔ですごい。赤と緑を混ぜるのは考えたが、使わないA-X個を捨てる発想が意外と出ない。X個取った残りは関係ないなあとも思っていたのに。そうすることで、どのようにX+Y個を選んでも大丈夫になる。これも見た目より非自明。

F - Distributing Integers

まず根付き木で考える。根から出てる各辺についてその先の部分木の答え(あと頂点の数)がわかっていれば、それぞれの答えと、N-1個の書き込む整数の中からその部分木の頂点数を選ぶコンビネーション(2回目はN-1から最初の頂点数を引く)を掛けていけば求まりそう。ということで全方位木DP。書いたことないけど行けそうだ。有向辺にその先の部分木の答えを入れていけば、同じことを2回計算せず辺はO(N)本しかないので。頑張って書きあげて提出するもTLE!かなり動揺した。5分ほどで、木がうに(スター)のときにTLEすると気づいた。ちょっと考えて大丈夫だと思っていたが、うにの中心の頂点へはO(N)回来るしそこでO(N)本の辺を調べなおしている。ということで頂点にも情報を載せることにするが、今度は部分木じゃないのでどうすればいいかわからない。親ノードのほうへもDFSしたりしたら、下手するとまたTLEになってしまう。頭が熱くなる中頑張って考えたが、間に合わなかった。できそうなのはわかるけど、簡潔な方針が全く見えない。複雑なのは書いたけどサンプルも合わなかった。