20分..WA+TLE
查看原帖
20分..WA+TLE
293127
doitagain楼主2020/8/15 18:04
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
int n,m,s,lg[500005],fa[500005][20],d[500005],v[500005];
vector <int> a[500005];
void dfs(int x,int p)  //x为当前节点 , p 为父结点 
{ 
	d[x]=d[p]+1; fa[x][0]=p;
  for (int j=1;j<=lg[d[x]-1]+1;j++)
  {
  	fa[x][j]=fa[fa[x][j-1]][j-1];
  }
  for (int i=0;i<a[x].size();i++)
  {  
  if (!v[a[x][i]])
  {
  	v[a[x][i]]=1;
  	 dfs (a[x][i],x);
  }
  	 
  }
}
int  LCA (int x,int y)
{
	if (d[x]<d[y]) {int t=y; y=x;x=t;}
	while (d[x]>d[y])
	{
		x=fa[x][lg[d[x]-d[y]]];
	}
	if (x==y) return x;
  for (int i=lg[d[x]-1];i>=0;i--)
  {
  	  if (fa[x][i]!=fa[y][i])
  	  {
  	x=fa[x][i];  y=fa[y][i];  	
	}
  }
  return fa[x][0];
  
}
int main()
{  memset (v,0,sizeof(v));
  cin>>n>>m>>s;
  for (int i=1;i<=n-1;i++)
  {
  	int x,y;
  	cin>>x>>y;
  	a[y].push_back(x);
  	a[x].push_back(y);
  }
  lg[0]=-1; lg[1]=0;  int t=2;
  for (int i=2;i<=n;i++)
  {
  	if (i==t)
  	{
  	  t*=2;
	 lg[i]=lg[i-1]+1;	
	}
	else
	{
		lg[i]=lg[i-1];
	}
  }
  v[s]=1;
  dfs (s,s);
  for (int i=1;i<=m;i++)
  {
  	int x,y;
  	cin>>x>>y;
  	cout<<LCA(x,y)<<endl; 
  }
} 
2020/8/15 18:04
加载中...