70分求助,TLE3个,MLE4个
查看原帖
70分求助,TLE3个,MLE4个
873786
wangjiajinself楼主2024/5/28 20:15
#include <iostream>
#include <cstdio> 
using namespace std;
const int N=5e5+10;
int n,m,s,x,y,head[N],cnt=0,dep[N],lg[N],f[N][21];
struct node{
	int to,nxt=-1;
}e[N]; 
void add(int u,int v){
	e[++cnt].to=v;
	e[cnt].nxt=head[u];
	head[u]=cnt;
}
void dfs(int x,int fa){
	dep[x]=dep[fa]+1;
	f[x][0]=fa;
	for(int i=head[x];i!=-1;i=e[i].nxt){
		int to=e[i].to;
		if(to!=fa) dfs(to,x);
	}
}
int find(int x,int y){
	if(dep[x]<dep[y]) swap(x,y);
	while(dep[x]>dep[y]) x=f[x][lg[dep[x]-dep[y]]];
	if(x==y) return x;
	for(int i=20;i>=0;i--){
		if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
	}
	return f[x][0];
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m>>s;
	for(int i=1;i<=n-1;i++){
		cin>>x>>y;
		add(x,y);
		add(y,x);
	}
	dfs(s,0);
	for(int i=1;i<21;i++)
	    for(int j=1;j<=n;j++)
	    f[j][i]=f[f[j][i-1]][i-1];
	lg[1]=0;
	for(int i=2;i<=n;i++) lg[i]=lg[i/2]+1;
	for(int i=1;i<=m;i++){
		cin>>x>>y;
		cout<<find(x,y)<<"\n";
	}
	return 0;
}
2024/5/28 20:15
加载中...