LCA TLE 6个点 ,求助
查看原帖
LCA TLE 6个点 ,求助
694647
zwxadz楼主2023/11/19 15:02
#include<bits/stdc++.h>
#define mkp make_pair
using namespace std;
int f[1000000][100],d[1000000],ans=-1,a[100005],lg[100005];
int ver[1000000],Next[1000000],head[1000010];
bool flag;
int n,m,tot,t;
queue<int> q;
void add(int x ,int y)
{
	ver[++tot]=y,Next[tot]=head[x],head[x]=tot;
}
void bfs()
{
	q.push(1),d[1]=1;
	while(!q.empty())
	{
		int x=q.front();q.pop();
		for(int i=head[x];i;i=Next[i])
		{
			int y=ver[i];
			if(d[y])continue;
			d[y]=d[x]+1;
			f[y][0]=x;
			for(int j=1;j<=lg[d[y]]+1;j++)f[y][j]=f[f[y][j-1]][j-1];
			q.push(y);
		}
	}
}
int lca(int x,int y)
{
	if(d[x]>d[y])swap(x,y);
	while (d[y] > d[x]) y = f[y][lg[d[y]-d[x]]];
	if(x==y)return x;
	for(int i=lg[d[x]];i>=0;i--)
		if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
	return f[x][0];
}
bool vis[100005];
int dis(int x,int y)
{
	return d[x]+d[y]-2*d[lca(x,y)];
}
int main()
{
	cin>>n>>m;
	for (int i=2; i<=n; i++)
		lg[i] = lg[i-1] + ((1<<(lg[i-1]+1)) == i);
	tot=0;
	for(int i=1;i<n;i++)
	{
		int x,y;
		cin>>x>>y;
		add(x,y);
		add(y,x);
	}
	bfs();
	while(m--)
	{
		for(int i=1;i<=n;i++)a[i]=0,vis[i]=0;
		int u,v,w,x;
		cin>>u>>v>>w>>x;
		int l1=lca(u,v);
		int l2=lca(w,x);
		if(dis(l1,w)+dis(l1,x)==dis(w,x) || dis(l2,u)+dis(l2,v)==dis(u,v))
		{
			cout<<"Y\n";
		}
		else
		{
			cout<<"N\n";
		}
	}
}
2023/11/19 15:02
加载中...