倍增LCA模板

2021-09-01 05:43:02 字數 765 閱讀 9013

注意!本篇題解不適合初學lca的同學學習,因為我講的很爛很不清楚。

倍增,顧名思義,就是成倍增加的意思。

我們知道,任何乙個數字都可以表示成二進位制。那麼對於一條長度為n的鏈,我們總是可以跳大概logn次到達最後。

對於鏈上任意一點,我們都可以在大概logn的複雜度下詢問到,其實倍增的思路就是二分,和快速冪一模一樣。

那麼怎麼用倍增求lca呢?

首先在樹上求每個節點的深度,並且更新每個節點的祖先節點。假如有a和b兩個結點,我們就假設深度大的為a,我們可以在logn的複雜度下跳到b的深度,然後a和b同時在logn的複雜度下跳到lca。

所以倍增求lca的複雜度是logn的啦。

下面上**吧:(這是乙份常數極大的模板,慎用。)

#include using namespace std;

const int maxn = 5e5+7;

const int maxl = 21;

int fa[maxn][maxl];

int depth[maxn];

int lg[maxn];

vectorg[maxn];

void dfs(int now,int last)

} return fa[x][0];

}int main()

for(int i=1;i<=n;i++)

dfs(s,0);

for(int i=0;ireturn 0;

}

LCA倍增法模板

deg其實應該寫成depth吧,存的是每個結點的深度,dfs的過程是為了處理出每個結點的深度,用遞推式計算出fa u i 其中f u i 表示u的第2 i個祖先 基本思想是 d i 表示 i節點的深度,p i,j 表示 i 的 2 j 倍祖先 那麼就有乙個遞推式子 p i,j p p i,j 1 j...

lca倍增演算法模板

時間限制 1 sec 記憶體限制 128 mb 提交 244 解決 36 提交 狀態 給一棵樹,節點數為n 1 n 250,000 和q 0 q 100,000 個詢問,對於每個詢問求出所求兩點的最近公共祖先 第一行 節點數n 以下n行,第i 1行 點i的父親節點father i 假定根的父親是0 ...

倍增求lca(模板)

定義 lca,最近公共祖先,是指一棵樹上兩個節點的深度最大的公共祖先。也可以理解為兩個節點之間的路徑上深度最小的點。我們這裡用了倍增的方法求了lca。我們的基本的思路就是,用dfs遍歷求出所有點的深度。f i j 陣列用來求的是距離節點i,距離2 j的祖先。可以知道,f i 0 就是它的直接父親。然...