長鏈剖分筆記

Laijinyi發表於2024-07-15

與輕重鏈剖分相似.

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 陣列的深度維總是達到了子樹高度的上限、是對的,而重剖不一定,這樣正確性就假了;且重剖不一定滿足從每個點往上跳,鏈長總是遞增的.

什麼?你要例子?比如說這個:

image

例題,分散放其他地方。

相關文章