與輕重鏈剖分相似.
dfs1:高度 \(h\)、\(son\);dfs2:\(top\).
性質 1:到根最多 \(O(\sqrt n)\) 條輕邊. (證明:長鏈長度最壞情況:1, 2, 3...)
性質 2:\(x\) 的 \(k\) 級祖先 \(y\) 所在的長鏈長度 \(\ge k\).(證明:若非,則 \(y-x\) 是一條更長的鏈,矛盾.)
樹上 \(k\) 級祖先 \(O(n\log n)-O(1)\):每個點 \(i\) 處理倍增跳祖先陣列 \(f(i,j)\),鏈頂 \(i\) 處理向下 \(h_i\) 個點(長鏈上)、向上 \(h_i\) 個點.
詢問 \((x,k)\):令 \(y=f(x,\log k)\),問題轉化為求 \(z=(y,k-2^{\log k})\);\(z\) 一定在 \(top(y)\) 記憶體儲,根據深度判 \(z\) 是 \(top(y)\) 的祖先 / 後代. 就 \(O(1)\) 了.(性質 2 易證)
最佳化樹上以深度為狀態的 dp:套路:繼承重兒子,合併輕兒子. 複雜度要為長鏈長度之和相關 \(=O(n)\).
Q:為什麼不用輕重鏈剖分像這樣最佳化 dp?
A:因為長剖使對於每個點 \(u\) 按這樣算出來的 dp 陣列的深度維總是達到了子樹高度的上限、是對的,而重剖不一定,這樣正確性就假了;且重剖不一定滿足從每個點往上跳,鏈長總是遞增的.
什麼?你要例子?比如說這個:
例題,分散放其他地方。