写一晚上了,一直错 TLE+RE+WA 20pts
查看原帖
写一晚上了,一直错 TLE+RE+WA 20pts
691036
Oye0ye楼主2024/7/12 20:47
#include<bits/stdc++.h>
using namespace std;
int n,m,s;
int h[1000010],dep[500010],e[1000010],ne[1000010],f[500010][21],idx=0;
void add(int a,int b)
{
	e[idx]=b;
	ne[idx]=h[a];
	h[a]=idx++;
}
void dfs(int u,int d)
{
	dep[u]=d;
	for(int ii=h[u];ii!=-1;ii=ne[ii])
	{
		int j=e[ii];
		if(!dep[j] and j!=s)
		{	
			//cout<<" "<<u<<" "<<j<<endl;
			dfs(j,d+1),f[j][0]=u;
		}
	}
}
int lca(int u,int v)
{
	if(dep[u]<dep[v])swap(u,v);
	//u 大 v 小 
//	cout<<dep[u]<<" "<<dep[v]<<endl;
	int temp=dep[u]-dep[v];
	int it=20;
	while(dep[v]!=dep[u])
	{
	
		if(dep[f[u][it]]>=dep[v])       //u 大 v 小 
		{	    
			//cout<<endl;
			u=f[u][it];	
		}
		it--;
	}
	if(u==v)return u;
	for(int i=log2(dep[u]);i>=0;i--)
	{
		if(f[u][i]!=f[v][i])
		{
			u=f[u][i];
			v=f[v][i];
		}
	}
	return f[u][0];
}
int main()
{
	memset(h,-1,sizeof(h));
	cin>>n>>m>>s;
	for(int i=1;i<n;i++)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		add(a,b);
		add(b,a);
	}
	f[s][0]=s;
	dfs(s,1);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;(j<<1)<=n;j++)// i<<1 是因为0的就是父节点 所以循环从1开始循 意思为2步 2=2^1 
		{
			f[i][j]=f[f[i][j-1]][j-1];
		}
	}
	for(int i=1;i<=m;i++)
	{
		int l,r;
		scanf("%d%d",&l,&r);
		printf("%d\n",lca(l,r));
	}
	
}
/*
5 1 4
3 1
2 4
5 1
1 4
2 4
*/
2024/7/12 20:47
加载中...