倍增LCA 70WA 30RE求助
查看原帖
倍增LCA 70WA 30RE求助
205782
R浩轩泽Anmicius楼主2020/8/29 13:27

思路参考题解,若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;
}

请问哪错了?

2020/8/29 13:27
加载中...