I - Exactly K Steps 解説
by
Mitsubachi
クエリ先読みをしなくとも解けます.直径の考察までは公式解説と同じです.するとクエリは以下の問題に帰着することができます.
木における頂点 $U_i$ から頂点 $A$ までの距離が $K_i$ 以上か判定せよ.もし $K_i$ 以上ならば $U_i$ から $A$ に向かって $K_i$ 進んだ先の頂点の番号を求めよ.今回においては $A$ として考える候補は直径の端点の $2$ つのみで十分ですので,これをある程度高速に解ければ良いです.
このような問題は Jump on Tree (Library Checker) と呼ばれています.
クエリあたり $O(1)$ で解くこともできますが,一般的な LCA の構造を用いたクエリあたり $O (\log N)$ 解法を紹介します.適当に根を取り, $O (N \log N)$ などの前準備により $dp (i, j) := $ 頂点 $i$ から上に $2^j$ 進んだ先の頂点や各頂点の深さが分かっているとします.
$U_i$ と $A$ の LCA を $l$ とします. $U_i$ から $l$ の距離を $d_1$ とし $l$ から $A$ の距離を $d_2$ とします. $d_1 + d_2 \geq K_i$ とします.
$K_i \leq d_1$ のときは答えは $U_i$ から上に $K_i$ 進んだ先の頂点です.そうでないときは $A$ から上に $d_1 + d_2 - K_i$ 進んだ先の頂点です.
$l, d_1, d_2$ の計算やある頂点から上に $d$ 進んだ頂点の計算などは $dp$ や各頂点の深さなどを用いて $O( \log N)$ で計算できます.よって全体で $O ( \log N)$ で計算できます.
以上より,この問題は全体で $O ( (N + Q) \log N)$ で解けます.
投稿日時:
最終更新: