代码感觉没问题,样例能过,但是只有10分
查看原帖
代码感觉没问题,样例能过,但是只有10分
261262
WaltVBAlston楼主2021/10/31 08:49

RT,小编十分疑惑

求大佬帮忙看看code:

#include<iostream>
#include<cstdio>
using namespace std;
int n,q,m,s;
int u[1000005],v[1000005],before[1000005],now[1000005];
int anc[1000005][21],depth[1000005];
int lg[1000005];
int k=0;
void add(int x,int y,int i){
	u[i]=x,v[i]=y;
	before[i]=now[u[i]];
	now[u[i]]=i;
}
void pre(int x,int fa){
	anc[x][0]=fa,depth[x]=depth[fa]+1;
	for(int i=1;i<=lg[depth[x]];i++)
		anc[x][i]=anc[anc[x][i-1]][i-1];
	for(int i=now[x];i!=-1;i=before[i])
		if(v[i]!=fa)
			pre(v[i],x);
	return; 
}
int lca(int x,int y){
	if(depth[x]<depth[y])
		swap(x,y);
	//cout<<x<<" "<<depth[x]<<endl;
	//cout<<y<<" "<<depth[y]<<endl;
	while(depth[x]>depth[y])
		x=anc[x][lg[depth[x]-depth[y]]-1];
	for(int i=lg[depth[x]];i>=0;i--)
		if(anc[x][i]!=anc[y][i])
			x=anc[x][i],y=anc[y][i];
	return anc[x][0];
}
int main(){
	cin>>n>>q>>s;
	m=n-1;
	for(int i=1;i<=n;i++)
		now[i]=-1;
	for(int i=1;i<=m;i++){
		int x,y;
		cin>>x>>y;
		add(x,y,++k);
		add(y,x,++k);
	}
	lg[0]=0;
	for(int i=1;i<=n;i++)
		lg[i]=lg[i>>1]+1;
	pre(s,s);
	while(q--){
		int x,y;
		cin>>x>>y;
		cout<<lca(x,y)<<endl;
	}
	return 0;
}
2021/10/31 08:49
加载中...