爆零求助 样例过了 lca倍增
查看原帖
爆零求助 样例过了 lca倍增
302750
Main_WF楼主2021/7/21 20:20
#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;
struct node{
	int v,nxt;
}e[2*maxn];int k,head[maxn];
void add(int u,int v){e[++k].v=v;e[k].nxt=head[u];head[u]=k;}

int n,q;
bool vis[maxn];
int lg[maxn],depth[maxn],f[maxn][20];

void dfs(int u)
{
	vis[u]=1;
	for(int i=head[u];i;i=e[i].nxt)
	{
		int v=e[i].v;
		if(!vis[v])
		{
			depth[v]=depth[u]+1;
			f[v][0]=u;
			for(int j=1;j<=lg[depth[v]];j++)
				f[v][j]=f[f[v][j-1]][j-1];
			dfs(v);
		}
	}
}

int lca(int a,int b)
{
	if(depth[a]<depth[b])swap(a,b);
	while(depth[a]<depth[b])a=f[a][lg[depth[a]-depth[b]]-1];
	if(a==b)return a;
	for(int i=lg[depth[a]]-1;i>=0;i--)
	{
		if(f[a][i]!=f[b][i])
		{
			a=f[a][i];
			b=f[b][i];
		}
	}
	return f[a][0];
}

int dist(int a,int b)
{
	int f=lca(a,b);
	return abs(depth[f]-depth[a])+abs(depth[f]-depth[b]);
} 

int main()
{
	cin>>n>>q;
	for(int i=1;i<=n-1;i++)
	{
		int a,b;cin>>a>>b;
		add(a,b);add(b,a);
	}
	for(int i=1;i<=n;i++)lg[i]=lg[i-1]+(1<<lg[i-1]==i);
	
	depth[1]=1;
	dfs(1);
	
	for(int i=1;i<=q;i++)
	{
		int a,b,c,d;
		cin>>a>>b>>c>>d;
		int x=lca(a,b);
		int y=lca(c,d);
		if(dist(c,x)+dist(x,d)==dist(c,d)||dist(a,y)+dist(y,b)==dist(a,b))cout<<'Y'<<'\n';
		else cout<<'N'<<'\n'; 
	}
}

2021/7/21 20:20
加载中...