Official

G - Ancestor Query Editorial by Forested


各頂点の深さを前計算しておくことで、次のクエリに高速に答えることができれば良くなります。

頂点 \(x\) と整数 \(k\) が与えられるので、\(x\) から親方向への辺を \(k\) 回辿った先にある頂点を答えよ。

これは Level Ancestor と呼ばれる問題です。

例えばダブリングを用いれば、前計算 \(O(N \log N)\) 時間、\(1\) クエリあたり \(O(\log N)\) 時間で処理できます。やや高度ですが、Heavy-Light Decomposition を用いると前計算 \(O(N)\) 時間、各クエリ \(O(\log N)\) 時間にできます。

オフラインで \(O(N+Q)\) 時間で処理する方法も知られています。なお、高度なアルゴリズムを用いてオンラインで \(O(N+Q)\) 時間にすることも可能です。

posted:
last update: