小倉鼠的和他的基(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...