蒟蒻求助,本地过了,在线IDE也过了,但是提交后就是全部RE...
查看原帖
蒟蒻求助,本地过了,在线IDE也过了,但是提交后就是全部RE...
288327
xzc_code楼主2020/8/2 20:36
#include<iostream>
#include<cstdio>
#include<cstring>
#define MS(x) memset(x,0,sizeof x) 
using namespace std;
const int MAX=500005;
int F[19][MAX];
int head[MAX],nxt[MAX*2],ver[MAX*2],dep[MAX];
int tot=0;
int n,m,s;
int addedge(int x1,int x2)
{
	  ver[++tot]=x2;
	  nxt[tot]=head[x1];
	  head[x1]=tot;
	  ver[++tot]=x1;
	  nxt[tot]=head[x2];
	  head[x2]=tot;
}



void dfs(int x)
{
	for(int i=head[x];i;i=nxt[i])
	{
		if(ver[i]==F[0][x]) continue;
		F[0][ver[i]]=x;
		dep[i]=dep[x]+1;
		dfs(ver[i]);
	}
	
}

void build()
{
	for(int i=1;i<19;++i)
	{
		for(int j=1;j<=n;++j)
		{
			F[i][j]=F[i-1][F[i-1][j]];
		}
		
	}
}

int query(int a,int b)
{
	if(dep[a]<dep[b])
		swap(a,b);
	int temp=dep[a]-dep[b];
	for(int i=18;i>=0;--i)
	{
		if(temp>=(1<<i))
		{
			temp-=1<<i;
			a=F[i][a];
		}
	}
	for(int i=18;i>=0;--i)
	{
		if(F[i][a]!=F[i][b])
		{
			a=F[i][a];
			b=F[i][b];
		}
	}
	return F[0][a];
}

int main()
{
	MS(head);
	MS(nxt);
	MS(ver);
	memset(F,0,sizeof F);
	cin>>n>>m>>s;
	int x,y;
	for(int i=1;i<n;++i)
	{
		scanf("%d%d",&x,&y);
		addedge(x,y);
	}
	dep[s]=1;
	F[0][s]=s;
	dfs(s);
	build();
	int a,b;
	for(int i=0;i<m;++i)
	{
		scanf("%d%d",&a,&b);
		printf("%d\n",query(a,b));
	}
	return 0;
}
2020/8/2 20:36
加载中...