ABC163

4完。unratedなので心拍数が上がることもなく、順位が悪くても何も感じず。

A - Circle Pond

周長は半径に比例する。誤差もかなり許される。ということで、出力例1から6.28318530717958623200をコピペして使う。

B - Homework

Nから引き算していって、max(n, -1)を出力する。

C - management

根付き木だと思うと子ノードの数なので、グラフを構築するときみたいに書いて、辺を追加する代わりに親をインクリメントする。

D - Sum of Large Numbers

10^100が付いてるのは、選ぶ個数が違うときは別カウントという意味だ。i個ちょうどのとき何通りあるか考えると、O(1)時間で求めるのはちょっと難しそうに見えるけど、よく見ると小さいほうからi個選ぶのが最小で大きいほうからi個選ぶのが最大、そしてその間の数は全部達成できる(1個ずつずらしていけばいい)。ということで、最小と最大の差を考えればよくて、これは普通に計算してもいいし、それが面倒なら累積和でもO(1)でできる。unratedだったので前者を選択(ratedだったら何も考えず書ける累積和に行ったかも)。

E - Active Infants

何もわからない。経験的に、「これは絶対解けないよ」と思うときはDPで解けることが多いので色々考えてみるができない。どっち向きから見ればいいのかなあと、色々な発想を出そうとしてみるが、出そうとしたって出ない。普通にやるとO(N!)とかになりそうだが、何か所か決めたときにその場所をどの幼児が占有したかは関係ないことで計算量が落ちるのだろうと思って考えたが何も出ず。

F - path pass i

一度も通らないやつを数えたほうが簡単そう。それでもかなり複雑そうだが、各色が1個ずつであれば部分木の頂点数を数えておいて簡単。ということで、各色についてO(その色の頂点数)で解ければいいことになる。全体をたくさんの木に分けるのを各色について共通の処理をしてというのはいかにも大変。ここで長時間停滞したが、その色の頂点の子ノードを根とする部分木で考えることを思いつき、これは可能性がありそうだ。最近yosupo judgeで木の問題をたくさん解いていた成果だ。部分木から、そのさらに子孫の同じ色以下の頂点は除く必要がある。各色の値をO(N)個持っておいてそれを自分の色だけ更新しながらDFSすれば全体でO(N)の計算量で全部の色の情報が得られるというのは最初から思いついていたが、どう使うかがかなり繊細で難しい。最後に根を含む残った領域を各色について処理するのを忘れずに。結局、コンテスト後にゆっくり考えてようやく書き切れた(細かいミスも多かったし、しょーもないバグもあった)。