o
の隣は無条件に .
に書き換えておいた。DP をするのかな復元するのかなどうやるのかなと最初は考えていたけど、出力が必然の o
か .
かそれ以外の ?
かということで、2通りの可能性があるなら即座に ?
が決定するのだった。最終的に見つかった条件は、「? を1つ以上 o に変えるかどうか」「? を最大限 o に変えなければいけないかどうか」「(最大限 ? を o に変えるとして)連続する ? の個数が偶数か奇数か」というものだった。これで T が決まる。方針を定める時間と考えながら実装する時間で 30 分かかった。■E 問題 Reachable Set。不可能なケースがあるのかなとまず考えた。ある。サンプル2がそうなんだけど、頂点5を経由しないと頂点1と2が連結にならないので、k=2,3,4 が -1 (不可) になる。じゃあ使える辺を使ったときに 1-k までが連結かどうかを UnionFind で管理したいね。同時に、使えない辺の先に繋がっている消したい頂点の集合を管理したいね。同時にできる? できる。14 分かけたので D の半分。■F 問題 Add One Edge 3。直径の候補は木1の直径と、木2の直径と、i-j を結んで新しくできた i-j を通る直径の3種類だと思った。木の直径は DFS 2回で求まる。新しくできる直径は、各頂点について最も遠い頂点がどれだけ遠いかわかっていればわかる。それは全方位木 DP で求まる。2回の DFS を2つの木に対して合計4回やると、2秒を超えてしまって TLE だった。なにかへまをしていて5秒 10 秒かかるようなスクリプトになっているなら惜しくはないけど、制限時間が3秒だったら通っていたというならあまりにも残念。■コンテスト成績証。ぴったりギリギリで青パフォ。973 位だから「3桁順位に入りたいよー」と書いていた前回の雪辱は果たせたけど、最近落ち目なのだから今日くらいはもっと調子に乗らせてほしかった。