思路参考题解,若dist(c,lca(a,b))+dist(lca(a,b),d)==dist(c,d),则路径相交。代码如下:
#pragma GCC opitimize(2)
#pragma GCC opitimize("Ofast")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define re register int
const int N=1e5+10;
const int K=20;
int n,q,num,head[N],depth[N],fa[N][K],log_2[N];
char ans;
struct Edge{
int to;
int next;
}edge[N];
inline void add_edge(int x,int y)
{
edge[++num].to=y;
edge[num].next=head[x];
head[x]=num;
}
void dfs(int u,int father)
{
depth[u]=depth[father]+1;
for(re i=0;i<=log_2[depth[u]];++i)
fa[u][i+1]=fa[fa[u][i]][i];
for(re i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(v==father)continue;
fa[v][0]=u;
dfs(v,u);
}
}
inline int LCA(int a,int b)
{
if(depth[a]<depth[b])swap(a,b);
for(re i=log_2[depth[a]];i>=0;--i)
{
if(depth[fa[a][i]]>=depth[b])a=fa[a][i];
if(a==b)return a;
if(depth[a]==depth[b])break;
}
for(re i=log_2[depth[a]];i>=0;--i)
if(fa[a][i]!=fa[b][i]&&fa[a][i])
{
a=fa[a][i];
b=fa[b][i];
}
return fa[a][0];
}
inline int dist(int a,int b)
{
int lca=LCA(a,b);
return (depth[a]-depth[lca])+(depth[b]-depth[lca]);
}
inline int reads()
{
int x=0;
char ch=getchar();
while(ch<'0'||ch>'9')ch=getchar();//滤去多余空格
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x;
}
inline void starts()
{
memset(head,0,sizeof(head));
memset(depth,0,sizeof(depth));
memset(fa,0,sizeof(fa));
for(re i=1;i<=n;++i)
log_2[i]=log_2[i-1]+(1<<log_2[i-1]==i);
for(re i=1;i<=n;++i)--log_2[i];//卡常
}
int main()
{
//ios::sync_with_stdio(false);
n=reads();q=reads();
starts();
for(re i=1;i<n;++i)
{
int x=reads(),y=reads();
add_edge(x,y);
add_edge(y,x);
}
while(q--)
{
int a=reads(),b=reads(),c=reads(),d=reads();
int lca1=LCA(a,b),lca2=LCA(c,d);
if(dist(a,lca2)+dist(lca2,b)==dist(a,b))ans='Y';
else if(dist(c,lca1)+dist(lca1,d)==dist(c,d))ans='Y';
else ans='N';
putchar(ans);putchar('\n');
}
return 0;
}
请问哪错了?