1. 程式人生 > 其它 >關於樹上k級祖先

關於樹上k級祖先

關於 \(Level\ Ancestor\) 問題(樹上 \(k\) 級祖先)的 \(\infty\) 種求法:

\(\large\texttt{Warning:}\) 此篇部落格其實是對 \(Luogu\ P5903\) 題解區中一些方法的彙總梳理,並不是本人原創!!!

  • 樹上倍增法:

    主要思路:通過倍增的思想,存下 \(x\)\(2^i\) 級祖先,在查詢時將 \(k\) 進行二進位制分解,分解為 \(\displaystyle\sum^t_{i=1}2^{a_t}\) 次方的形式,再每次向上跳 \(2^{a_t}\) 步,跳完 \(t\) 次後就得到了 \(x\)\(k\)

    級祖先。

    時間複雜度:\(\cal{O((n+q)\log_2n)}\)

    空間複雜度:\(\cal{O(n\log_2n)}\)

  • 輕重鏈剖分法:

    主要思路:進行輕重鏈剖分,在查詢時判斷當前點 \(x\) 所在的重鏈頂點是否在其 \(k\) 級祖先上放。若不在其上方,則將 \(x\) 跳至鏈頂的父親節點,並讓 \(k\) 減去這一段的長度,並繼續處理。否則則利用求出的 \(\texttt{dfs}\) 序直接計算。

    時間複雜度:\(\cal{O(n-q\log_2n)}\)

    空間複雜度:\(\cal{O(n)}\)

  • 輕重鏈剖分法 + 樹上倍增法:

    主要思路:在輕重鏈剖分法的基礎上,利用倍增預先處理出向上跳 \(2^i\)

    次能到達的節點,就可以優化時間複雜度了。

    時間複雜度:\(\cal{O(n\log_2\log_2 n - q\log_2\log_2 n)}\)

    空間複雜度:\(\cal{O(n\log_2\log_2 n)}\)

  • 長鏈剖分(咕咕咕)

咕咕咕