0pts RE求助
查看原帖
0pts RE求助
945246
zhangzehao1楼主2023/12/24 11:22
#include<bits/stdc++.h>
#define UP(i,a,b) for(int i=a;i<=b;i++)
#define DN(i,a,b) for(int i=a;i>=b;i--)

const int M=500005;
using namespace std;

int n,m,s;
int fa[M][20];
int deep[M];
int lg[M];
bool vis[M];
vector<int> edge[M];

template<typename T> inline void read(T & r)
{
    char m=1;
    char c=getchar();
    r=0;
    for(;!isdigit(c);c=getchar())
	{
        if(c=='-');
        m=-1;
    }
    for(;isdigit(c);c=getchar())
        r=(r<<3)+(r<<1)+(c^48);
    r*=m;
}

template<typename T> inline void write(T r)
{
    if(r>9) write(r/10);
    putchar(r%10+'0');
    puts("");
}

template<typename T> inline void dfs(T s,T f)
{
	int t=0;
	fa[s][0]=f;
	vis[s]=1;
	deep[s]=deep[f]+1;
	t=deep[s];
	UP(i,1,t) fa[s][i]=fa[fa[s][i-1]][i-1];
	UP(i,0,edge[s].size()-1)
	{
		int v=edge[s][i];
		if(v!=f) dfs(v,s);	
	}	
	return;
}

template<typename T> inline int LCA(T u,T v)
{
	if(deep[u]<deep[v]) swap(u,v);	
	while(deep[u]>deep[v])
	{
		int g=lg[deep[u]-deep[v]];
		u=fa[u][g];	
	}
	if(u==v) return u;
	DN(i,lg[deep[u]],0)
	{
		if(fa[u][i]!=fa[v][i])
		{
			u=fa[u][i];
			v=fa[v][i];
		}
	}
	return fa[u][0];
}

int main()
{
	//freopen("P3379_1.in","r",stdin);
	read(n);read(m);read(s);
	UP(i,1,n-1)
	{
		int u,v;
		read(u);read(v);
		edge[u].push_back(v);
		edge[v].push_back(u);
	}
	int j=2,k=0;
	UP(i,1,(n<<1)-1)
	{
		if(i==j) 
		{
			j<<=1;
			k++;
		}
		lg[i]=k;
	}
	dfs(s,0);
	UP(i,1,m) 
	{
		int a,b;
		cin>>a>>b;
		write(LCA(a,b));
	}
	return 0;
}
2023/12/24 11:22
加载中...