洛谷 P3379 模板 最近公共祖先(LCA)

2021-08-28 04:00:51 字數 1558 閱讀 3177

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

輸入格式:

第一行包含三個正整數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。

ps:題目說是模板題,大致的意思感覺和rmq差不多,就是用乙個二維 的陣列來儲存某節點i的2^j級祖先,例如root[1][2],表示1節點在第二級的祖先是哪個,先預處理,再從下向上找。

#include #include#include#include#include#include#include#include#include#includeconst int maxn=5e5+10;

const int mod=1e9+7;

const int inf=1e8;

#define me(a,b) memset(a,b,sizeof(a))

#define lowbit(x) x&(-x)

typedef long long ll;

using namespace std;

int head[maxn],deep[maxn],root[maxn][40],m,n,tot;

struct node

a[maxn<<1];

void add(int x,int fa)

void dfs(int x,int fa)//首先進行的預處理,將所有點的deep和p的初始值dfs出來

int main()

dfs(s,0);

while(m--)

return 0;

}

洛谷P3379 模板 最近公共祖先(LCA)

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

洛谷 P3379 最近公共祖先(LCA) 模板

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

洛谷 P3379 模板 最近公共祖先(LCA)

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