来个卡常大师
查看原帖
来个卡常大师
740329
sunaohua楼主2022/11/21 22:15
#include<bits/stdc++.h>
using namespace std;
int s;
map<int,map<int,int> >mp;
vector<int> t[500005];
int c[500005];
int d[500005];
int f[500005];
int fa[500005];
bool yi[500005];
bool l[500005];
int ll[500005];
inline int read()
{
    int w=0,f=1;
    char ch=getchar();
    while(ch<'0' || ch>'9')
    {
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
    {
        w=(w<<3)+(w<<1)+(ch^48);
        ch=getchar();
    }
    return w*f;
}
inline void add(int x,int y){
	c[x]++;c[y]++;t[x].push_back(y);t[y].push_back(x);
}
void dfs(int a,int b){
	fa[a]=b;
	d[a]=d[b]+1;
	if(b!=s){
	if(c[b]>2)
	f[a]=b;
	else
	f[a]=f[b];	
	}
	else
	f[a]=s;
	for(int i=1;i<=c[a];i++){
	if(t[a][i]!=b)
	dfs(t[a][i],a);
	}
}
void dfs2(int a,int b){
	if(yi[a]==true)
	return;
	yi[a]=true;
	if(c[a]==2&&a!=s){
	l[a]=1;
	ll[a]=ll[b];
	}
	else
	ll[a]=a;
	dfs2(fa[a],a);
}
int lca(int a,int b){
	while(a!=b){
//	cout<<a<<" "<<b<<endl;
	if(d[a]>=d[b]){
	if(ll[a]==f[b]||ll[a]==ll[b])
	return b;
	}
	else{
	if(ll[b]==f[a]||ll[a]==ll[b])
	return a;
	}
	if(d[a]<=d[b])
	b=f[b];
	else
	a=f[a];	
	}
	return a;
}
signed int main() 
{
	int n,m,x,y,a,b;
	cin>>n>>m>>s;
	for(int i=1;i<=n;i++)
	t[i].push_back(0);
	for(int i=1;i<n;i++){
	x=read();
	y=read();
	add(x,y);
	}
	dfs(s,0);
	f[s]=s;
	for(int i=1;i<=n;++i){
	if(c[i]==1)
	dfs2(i,i);
	}
	
/*	for(int i=1;i<=n;i++)
	cout<<d[i]<<" ";
	cout<<endl;
	for(int i=1;i<=n;i++)
	cout<<f[i]<<" ";
	cout<<endl;*/
	for(int i=1;i<=m;++i){
	a=read();
	b=read();
	cout<<lca(a,b)<<endl;
	}
	return 0;
}
2022/11/21 22:15
加载中...