LCA倍增70pts TLE求调
查看原帖
LCA倍增70pts TLE求调
672645
zhouduanxing楼主2025/2/5 11:38
#include<bits/stdc++.h>
using namespace std;
long long n,m,s,depth[10000000],fa[999999][99],lg[999999],head[99999];
//fa[i][j]表示节点i的2^j级祖先 
struct node{//结构体存树 
	long long t;
	long long next;
}a[9000000];
long long x,y,p;
void add(int x,int y)
{
	p++;
	a[p].t=y;
	a[p].next=head[x];
	head[x]=p;
}
void dfs(int x,int f)
{
	fa[x][0]=f;
	depth[x]=depth[f]+1;
	for(int i=1;i<=lg[depth[x]];i++)
	{
		fa[x][i]=fa[fa[x][i-1]][i-1];
	}
	for(int i=head[x];i;i=a[i].next)
	{
		if(a[i].t!=f)
		{
			dfs(a[i].t,x);
		} 
	}
}
int LCA(int x,int y)
{
	if(depth[x]<depth[y])
	{
		swap(x,y);
	}
	while(depth[x]>depth[y])
	{
		x=fa[x][lg[depth[x]-depth[y]]-1];
	}
	if(x==y)return x;
	for(int k=lg[depth[x]];k>=0;k--)
	{
		if(fa[x][k]!=fa[y][k])
		{
			x=fa[x][k];
			y=fa[y][k];
		}
	}
	return fa[x][0];
}
int main() 
{
	scanf("%lld %lld %lld",&n,&m,&s);
	for(int i=1;i<=n-1;i++)
	{
		scanf("%lld %lld",&x,&y);
		add(y,x);
		add(x,y);
	}
	for(int i=1;i<=n;i++)
	{
		lg[i]=lg[i-1]+(1<<lg[i-1]==i);
	}
	dfs(s,0);
	for(int i=1;i<=m;i++)
	{
		scanf("%lld %lld",&x,&y);
		if(x==y)
		{
			printf("%d\n",x);
			continue;
		}
		printf("%d\n",LCA(x,y));
	}
	return 0; 
}
2025/2/5 11:38
加载中...