倍增30分TLE求调
查看原帖
倍增30分TLE求调
1040386
chenyiran2012楼主2025/2/7 10:06
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
void write(int x)
{
    if(x<0)
        putchar('-'),x=-x;
    if(x>9)
        write(x/10);
    putchar(x%10+'0');
    return;
}
int bz[500010][140];
int n,m,s,x,y,c,d;
vector<int> e[500010];
vector<int> b[500010];
int dep[500010];
void dfs(int x,int y){
	dep[x]=dep[y]+1;
	bz[x][0]=y;
	for (int i=1;i<=20;i++){
		for (int j=1;j<=n;j++){
			bz[j][i]=bz[bz[j][i-1]][i-1];
		}
	}
	for (auto i:b[x]){
		if (i!=y){
			dfs(i,x);
		}
	}
}
int lca(int x,int y){
	if (dep[x]<dep[y]){
		swap(x,y);
	}
	for (int i=20;i>=0;i--){
		if (dep[bz[x][i]]>=dep[y]){
			x=bz[x][i];
		}
	}
	if (x==y){
		return x;
	}
	for (int i=20;i>=0;i--){
		if (bz[x][i]!=bz[y][i]){
			x=bz[x][i];
			y=bz[y][i];
		}
	}
	return bz[x][0];
}
int main(){
	//ios::sync_with_stdio(0);
	//cin.tie(0);
	//cout.tie(0);
	n=read();
	m=read();
	s=read();
	for (int i=1;i<=n-1;i++){
		x=read();
		y=read();
		b[x].push_back(y);
		b[y].push_back(x);
	}
	dfs(s,0);
	while (m--){
		c=read();
		d=read();
		write(lca(c,d));
		cout << '\n';
	}
	return 0;
}
2025/2/7 10:06
加载中...