倍增 洛谷P3379 倍增求LCA

2022-05-29 04:06:13 字數 1477 閱讀 3505

如題,給定一棵有根多叉樹,請求出指定兩個點直接最近的公共祖先。

輸入格式:

第一行包含三個正整數n、m、s,分別表示樹的結點個數、詢問的個數和樹根結點的序號。

接下來n-1行每行包含兩個正整數x、y,表示x結點和y結點之間有一條直接連線的邊(資料保證可以構成樹)。

接下來m行每行包含兩個正整數a、b,表示詢問a結點和b結點的最近公共祖先。

輸出格式:

輸出包含m行,每行包含乙個正整數,依次為每乙個詢問的結果。

輸入樣例#1: 複製

5 5 4

3 12 4

5 11 4

2 43 2

3 51 2

4 5

輸出樣例#1: 複製

441

44

時空限制:1000ms,128m

資料規模:

對於30%的資料:n<=10,m<=10

對於70%的資料:n<=10000,m<=10000

對於100%的資料:n<=500000,m<=500000

樣例說明:

該樹結構如下:

第一次詢問:2、4的最近公共祖先,故為4。

第二次詢問:3、2的最近公共祖先,故為4。

第三次詢問:3、5的最近公共祖先,故為1。

第四次詢問:1、2的最近公共祖先,故為4。

第五次詢問:4、5的最近公共祖先,故為4。

故輸出依次為4、4、1、4、4。

題解

倍增求lca的板子。。。

反正就是處理好x向上1然後從深度深的往上跳。。。

**

//

by 減維

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

using

namespace

std;

struct

edgee[

1000005

];int n,m,s,ecnt,dep[500005],head[500005],f[500005][21

];void add(int x,int

y)void dfs(int x,int

fa)}

int lca(int x,int

y)

return f[x][0];}

intmain()

dfs(s,0);

for(int x,y,i=1;i<=m;++i)

}

洛谷P3379倍增LCA

include include include include include define re register using namespace std const int maxn 5 1e5 4 inline int read while ch 0 ch 9 return x f int n...

洛谷 3379 最近公共祖先 LCA 倍增

題目描述 如題,給定一棵有根多叉樹,請求出指定兩個點直接最近的公共祖先。輸入格式 第一行包含三個正整數 n,m sn,m,s n,m,s,分別表示樹的結點個數 詢問的個數和樹根結點的序號。接下來 n 1 n 1n 1 行每行包含兩個正整數 x,y x,y x,y,表示 x 結點和 y 結點之間有一條...

LCA 二分 倍增

兩個最近的點u和v的最近的公共的祖先稱為最近公共祖先 lca 普通的lca演算法,每算一次lca的時間複雜度為線性o n 這裡講lca 二分的方法。首先對於任意的節點v,利用其父節點的資訊,可以通過par2 v par par v 得到向上走兩步的節點。依此資訊可以通過par4 v par2 par...