倍增LCA複習

2021-07-22 22:06:59 字數 352 閱讀 1832

時間過去了如此之久,我連倍增lca都不怎麼記得了,要粗事啊。

首先預處理層數和每個節點的父親,然後預處理p陣列,p[i,j]表示i向上第2^j個祖先。最後對於每個詢問x,y先把x,y變成同一層數的(x或y向上走直到兩個層數相等),然後x,y同時向上走,直到x和y的父親相同位置。

****自

//1. dfs預處理出所有節點的深度和父節點

inline

void dfs(int u)

}}void init()

int lca(int a,int b)//最近公共祖先

} return p[a][0];

}

倍增LCA模板

注意!本篇題解不適合初學lca的同學學習,因為我講的很爛很不清楚。倍增,顧名思義,就是成倍增加的意思。我們知道,任何乙個數字都可以表示成二進位制。那麼對於一條長度為n的鏈,我們總是可以跳大概logn次到達最後。對於鏈上任意一點,我們都可以在大概logn的複雜度下詢問到,其實倍增的思路就是二分,和快速...

LCA倍增講解

這道題值得一刷 題解裡的巨佬都用tarjan 窩太難了 實際上是他們太巨了 本人 馬蜂 碼風獨特,請見諒 include include include include using namespace std inline intread while ch 0 ch 9 return x f inl...

LCA倍增演算法

一.倍增演算法的前期鋪墊 我們記節點v到根的深度為depth v 那麼如果節點w是節點u和節點v的最近公共祖先的話,讓u往上走 depth u depth w 步,讓v往上走 depth v depth w 步,都將走到節點w。因此,我們首先讓u和v中較深的乙個往上走 depth u depth v...