Codechef TALCA 最近公共祖先技巧

2021-08-28 22:27:50 字數 1618 閱讀 8986

給 出一

棵樹,回

答q個詢

問,每次

求以r為

根,u,

v的最近

公共祖先

.給出一棵樹,回答q個詢問,每次求以r為根,u,v的最近公共祖先.

給出一棵樹,

回答q個

詢問,每

次求以r

為根,u

,v的最

近公共祖

先.本來指望一波分討的,很煩,一點都不想寫.

有沒有簡單一點的辦法呢?

假設p 1p1

p1是u ,v

u,vu,

v的最近公共祖先,p2p2

p2是u ,r

u,ru,

r的最近公共祖先,p3p3

p3是v ,r

v,rv,

r的最近公共祖先.

在腦子裡稍微模擬一下,找棵點數比較多的樹手玩一下,大膽猜一波結論,答案就是p1,

p2,p

3p1,p2,p3

p1,p2,

p3中深度最大的點.

看來我猜對了.但是我還不會證,求教大佬.

求l ca

lcalc

a用的是樹剖,常數小得驚人,輕鬆碾壓獲得時間ran

k1

rank1

rank1.

#include

//ithea myse valgulious

namespace chtholly

template

<

typename mitsuha>

inline

bool

read

(mitsuha &x)

template

<

typename mitsuha>

inline

intwrite

(mitsuha x)

inline

char

fuhao()

}using

namespace chtholly;

using

namespace std;

const

int yuzu=

2e5;

vector<

int> lj[yuzu|10]

;typedef

int fuko[yuzu|10]

;namespace

}void

dfs2

(int u,

int _top)

intqlca

(int u,

int v)

}int

main()

dfs(1,

0),dfs2(1

,1);

for(

int q=

read()

,r,u,v;q--;)

;sort

(lca,lca+3,

[&](

int u,

int v));

write

(*lca)

,pl;

}}

謝謝大家.

最近公共祖先 python 最近公共祖先

lca演算法樸素演算法 也就是我們所說的暴力演算法,大致的思路是從樹根開始,往下迭代,如果當前結點比兩個結點都小,那麼說明要從樹的右子樹中找 相反則從左子樹中查詢 直到找到乙個結點在當前結點的左邊,乙個在右邊,說明當前結點為最近公共祖先,如果乙個結點是另外乙個結點的祖先,那麼返回前面結點的父親結點即...

最近公共祖先 LCA 最近公共祖先

直接暴力搜尋參考 普通搜尋每次查詢都需要 樸素演算法是一層一層往上找,倍增的話直接預處理出乙個 具體做法是 維護乙個 的關係來線性求出這個陣列 int anc n 31 int dep n 記錄節點深度 void dfs int u,int parent for int i 0 i g u size...

mysql 最近資料 Mysql 獲取最近資料資訊

今天 select from 表名 where to days 時間欄位名 to days now 昨天select from 表名 where to days now to days 時間欄位名 1 近7天select from 表名 where date sub curdate interval...