長鏈可以搭配良好的資料結構。只要找出樹上所有長鏈,每條長鏈套用線段樹、BIT、Sparse Table、BST、Heap,就能降低時間複雜度。
可以利用簡單的做法將dfs序切成許多長鏈:
- 首先先設定其中一點為根,算出每個子樹有多少節點
- 樹上每個節點各自連向最大的子樹,相連的部分會自然形成鏈
我們可以進行一個簡單的證明:
- 假設節點數為V,由根往任意葉節點走,一旦遇到新鏈,新鏈的子樹必小於等於原鏈子樹,剩下的節點數量不到一半,所以沿途最多遇到 logV 條鏈。
這些操作都可以在求LCA的過程中完成:
若樹鏈剖分的目的只是為了求LCA,build_link()及find_lca()有更好的做法:
這就只需進行一次DFS
沒有留言:
張貼留言