長鏈剖分總結


長鏈剖分總結

概念

長鏈剖分和輕重鏈剖分十分相似,都是將一棵樹節點的信息分成多條鏈的信息,但是前者是以深度剖分,后者則是以子樹大小來剖分。

同時長鏈剖分還借鑒了$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(詢問次數)$

代碼在這里

二、快速合並以深度為下標的子樹信息

這個題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM