0%

P3398 仓鼠找 sugar(倍增法求LCA)

思路讲解

判断树上a到b路径和c到d路径是否相交。

有一个小结论,就是如果两条路径相交,那么相交点至少是其中一条路径的最近公共祖先。

image

一呢,我们去构造反例,发现不太行,如果把那两个凸出来的点连接在一起就成环了。

那么我们发现如果不能连的话,相交点就成根节点了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//        保证共线
if(LCA(lcaAB,lcaCD)==lcaCD && LCA(c,lcaAB)==lcaAB){
cout<<"Y\n";
continue;
}
if(LCA(lcaAB,lcaCD)==lcaCD && LCA(lcaAB,d)==lcaAB){
cout<<"Y\n";
continue;
}
// ----------
// 看lcaCD在不在a->lcaAB上
if(LCA(lcaCD,lcaAB)==lcaAB && LCA(lcaCD,a)==lcaCD){
cout<<"Y\n";
continue;
}
if(LCA(lcaCD,lcaAB)==lcaAB && LCA(lcaCD,b)==lcaCD){
cout<<"Y\n";
continue;
}

AC代码

https://www.luogu.com.cn/record/217989209

心路历程(WA,TLE,MLE……)

WA

https://www.luogu.com.cn/record/217981621

主要是无法处理这种情况。

image