LCA 二分 倍增

2022-04-10 02:58:05 字數 872 閱讀 8028

兩個最近的點u和v的最近的公共的祖先稱為最近公共祖先(lca)。普通的lca演算法,每算一次lca的時間複雜度為線性o(n);

這裡講lca + 二分的方法。首先對於任意的節點v,利用其父節點的資訊,可以通過par2[v]=par[par[v]]得到向上走兩步的節點。依此資訊可以通過par4[v]=par2[par2[v]]得到向上走4步的節點。所以,根據此方法可以得到向上走2^k所得到的節點par[k][v]。每次搜尋的複雜度為o(log n),預處理par[k][v]的複雜度為o(nlog n)。(我覺得挑戰程式設計lca部分寫的挺明白的)

模版**如下:

1

//lca + 二分

23 vector g[max_v]; //

鄰接表4

int root; //

根的編號56

int par[max_log_v][max_v]; //

向上走2^k所到的父節點編號(根節點的父節點為-1)

7int dep[max_v]; //

節點的深度89

void dfs(int v , int p , int d) 15}

16//

預處理17

void init(int

n) 26}27

}28//計算u和v的lca

29int lca(int u , int

v) 36}37

if(u == v) //

要是節點相同則輸出lca

38return

u;39

for(int k = max_log_v - 1 ; k >= 0 ; k--) 44}

45return par[0

][u];

46 }

模板 二分 倍增及其應用

給定陣列 和 數字t,求最大位置k 滿足 sum 1 k t 最簡單的想法就是 字首和 二分,每次查詢時間複雜度log n 對於數列最左端的資料沒有必要 這裡的倍增可以理解為二分的改良優化版,設k點為0,p點為1 1.每次試從當前點k往後加p個數是否小於t 以log速度快速使k逼近答案點 2.隨後再...

倍增 洛谷P3379 倍增求LCA

如題,給定一棵有根多叉樹,請求出指定兩個點直接最近的公共祖先。輸入格式 第一行包含三個正整數n m s,分別表示樹的結點個數 詢問的個數和樹根結點的序號。接下來n 1行每行包含兩個正整數x y,表示x結點和y結點之間有一條直接連線的邊 資料保證可以構成樹 接下來m行每行包含兩個正整數a b,表示詢問...

NOIP2012 疫情控制 貪心 二分 倍增

一道很全 du 面 liu 的題 題目大意 給定一棵樹,用最少的時間封住這棵樹。題解 首先可以很容易發現乙個條件 軍隊在走的時候都要盡量往上走,但不到根節點。因為越靠近根節點的點,控制的葉子節點越多。不過暴力是肯定會超時的,用倍增優化。題目求的是最長移動時間軍隊的最短時間,想到二分答案。但是還有這樣...