長鏈剖分總結
概念
長鏈剖分和輕重鏈剖分十分相似,都是將一棵樹節點的信息分成多條鏈的信息,但是前者是以深度剖分,后者則是以子樹大小來剖分。
同時長鏈剖分還借鑒了$dsu\;on\;tree$的一些$trick$使得它能十分高效地合並子樹信息。
性質
破天荒地寫了證明
性質一
所有鏈長度之和為節點數
證明:
- 每個點在且僅在一條鏈中
性質二
任意一個點$k$級祖先所在長鏈的長度一定大於等於$k$
證明:
- 假如$y$所在長鏈的長度小於$k$,那么它所在的鏈一定不是重鏈,因為$x-y$這條鏈顯然更優,那么$y$所在的重鏈長度至少為$k$,性質成立。否則 $y$ 所以在長鏈長度大於等於 $k$ ,性質成立。
性質三
任意一個點跳重鏈到根所用的次數不超過$\sqrt n$
證明:
- 根據性質二,如果一個點從當前鏈跳到另一條鏈上,另一條鏈的長度大於當前鏈的長度
- 那么最壞情況為鏈長分別為$1,2,3...\sqrt n$共$\sqrt n$次
一些trick
一、高效計算k級祖先
首先對樹進行長鏈剖分,記錄每個節點所在的鏈的鏈頂,然后按深度記下每條鏈中的節點和這條鏈的長度個數個祖先,再預處理倍增數組代表$2^k$祖先。根據性質二,我們跳到節點的大於$\frac k2$次祖先,我們可以通過之前預處理出的鏈頂祖先中找到$k$及祖先,感性理解分析可得,第一次跳$highbit(k)$次祖先最快,復雜度$O(1)$
總復雜度$O(nlogn)+O(詢問次數)$