洛谷3398 倉鼠找sugar

2021-10-18 01:25:24 字數 1382 閱讀 1883

小倉鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每個節點的編號為1~n。地下洞穴是乙個樹形結構。這一天小倉鼠打算從從他的臥室(a)到餐廳(b),而他的**同時要從他的臥室(c)到圖書館(d)。他們都會走最短路徑。現在小倉鼠希望知道,有沒有可能在某個地方,可以碰到他的**?

小倉鼠那麼弱,還要天天被zzq大爺虐,請你快來救救他吧!

第一行兩個正整數n和q,表示這棵樹節點的個數和詢問的個數。

接下來n-1行,每行兩個正整數u和v,表示節點u到節點v之間有一條邊。

接下來q行,每行四個正整數a、b、c和d,表示節點編號,也就是一次詢問,其意義如上。

對於每個詢問,如果有公共點,輸出大寫字母「y」;否則輸出「n」。

這道題與洛谷6374樹上詢問中判斷c是否在a,b到lca(a,b)的路徑上的思路如出一轍。若兩條路徑有交點,顯然lca(a,b)或lca(c,d)必然是交點之一。將lca(a,b)或lca(c,d)當作樹上詢問中的c,分別判斷是否在另外兩個點到它們lca的路徑上即可。

#include

#include

#include

using

namespace std;

const

int n=

200000

,p=18

;int n,q;

int dep[n]

,st[n]

[p+1];

vector <

int> ed[n]

;void

dfs(

int x,

int fa)

intlca

(int x,

int y)

if(x==y)

return x;

step=p+1;

while

(--step>=0)

if(st[x]

[step]

!=st[y]

[step]

) x=st[x]

[step]

,y=st[y]

[step]

;return st[x][0

];}int

main()

dfs(1,

0);for

(int i=

1;i<=p;i++

)for

(int j=

1;j<=n;j++

) st[j]

[i]=st[st[j]

[i-1]]

[i-1];

int a,b,c,d;

char ans;

for(

int i=

1;i<=q;i++

)return0;

}

洛谷 3398 倉鼠找sugar

題目描述 小倉鼠的和他的基 me i mei mei 友 zi sug ar zi sugar zi su gar住在地下洞穴中,每個節點的編號為1 n1 n 1n。地下洞穴是乙個樹形結構。這一天小倉鼠打算從從他的臥室 a a a 到餐廳 b b b 而他的 同時要從他的臥室 c c c 到圖書館 ...

洛谷P3398 倉鼠找sugar

裸的lca。對於每次詢問,設a,b的lca為a,c,d的lca為b,分兩種情況討論 1 a與b的深度相同,此時二人相遇的充要條件為a b,即四個點的最近公共祖先相同。2 a與b深度不同,設a的深度大於b的深度,若二人相遇,則c或d與a的lca一定為a。include include define m...

洛谷P3398 倉鼠找sugar

題目大意 給你一棵 n n leqslant10 5 個點的樹,m m leqslant10 5 次詢問,每次詢問路徑 a b 和路徑 c d 是否有交點 題解 經過觀察發現若有交點,在 lca 或 lca 一定有交,判斷一下即可 卡點 無 c code include include includ...