样例过了10分,求调(玄关)
查看原帖
样例过了10分,求调(玄关)
942399
Kiw_楼主2024/10/22 18:00

样例过了10分WA求调

#include<bits/stdc++.h>
using namespace std;
const int MAXN=500005;
struct Edge{
	int to;
	int next;
}e[2*MAXN];
int head[MAXN],edtot;
int n,m,s,u,v;
int deep[MAXN],f[MAXN][25];
void addedge(int u,int v){
	edtot++;
	e[edtot].to=v;
	e[edtot].next=head[u];
	head[u]=edtot;
}
void buildtree(int u,int n){
	f[n][0]=u;
	deep[n]=deep[u]+1;
	for(int k=1;k<=24;k++)
		f[n][k]=f[f[n][k-1]][k-1]; 
	int i=head[n];
	while(i){
		if(e[i].to!=u) buildtree(n,e[i].to);
		i=e[i].next;
	}
	return;
}
int lca(int x,int y){
	if(deep[x]>deep[y]){
		swap(x,y);
	}
	for(int k=24;k>=0;k--){
		if(deep[x]==deep[y])
			break;
		if((1<<k)<=(deep[y]-deep[x])){
			x=f[x][k];
		}
	}
	for(int k=24;k>=0;k--)
	{
		if(f[x][k]!=f[y][k]){
			x=f[x][k];
			y=f[y][k];
		}
	}
	return f[x][0];
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m>>s;
	for(int i=1;i<n;i++){
		cin>>u>>v;
		addedge(u,v);
		addedge(v,u);
	}
	buildtree(s,s);
	for(int i=1;i<=m;i++){
		cin>>u>>v;
		if(u==v) cout<<u<<endl;
		else cout<<lca(u,v)<<endl;
	}
	return 0;
}
2024/10/22 18:00
加载中...