求助,本地没挂,IDE挂了
查看原帖
求助,本地没挂,IDE挂了
127925
Kio_楼主2021/10/2 09:25

不知道是什么特性,求助;w;

#include<cstdio>

using namespace std;

const int N = 5e5+10;
 
struct line{
	int u,v,nxt;
	line(int u=0,int v=0,int nxt=0):u(u),v(v),nxt(nxt){} //要初始化 
};
line e[N<<1];
int cnt, head[N];

inline void addline(int u, int v){
	e[++cnt] = line(u,v,head[u]), head[u] = cnt;
}

int n,m,s;
int fa[N][20], dep[N];

inline bool isd(int c){return '0'<=c&&c<='9';}
int read(){
	int num,c,f=1;
	for(;!(c=getchar());f=c);
	for(num=c^48;isd(c=getchar());(num*=10)+=c^48);
	return f^45?num:-num;
}

inline void swap(int &a,int &b){a^=b,b^=a,a^=b;}
void build(int x){
	for(int i=head[x];i;i=e[i].nxt){
		int y = e[i].v;
		if(fa[x][0]==y) continue;
		fa[y][0] = x;
		dep[y] = dep[x] + 1;
//		printf("%d %d\n",y,fa[y][0]);
		build(y);
	}
}

int main(){
	n=read(),m=read(),s=read();
	for(int i=1;i<=n-1;i++){
		int a=read(), b=read();
		addline(a,b); addline(b,a);
	}
//	printf("\n");
	build(s);
	for(int j=1;j<=19;j++){
		for(int i=1;i<=n;i++){
			fa[i][j] = fa[fa[i][j-1]][j-1];
//			printf("%d %d %d\n",i,j,fa[i][j]);
		}
// 			printf("\n");
	}
	
	while(m--){
		int a=read(), b=read();
		if(dep[a] < dep[b]) swap(a,b);
		int delta = dep[a] - dep[b];
//		printf("Delta: %d\n",delta);
		for(int i=19;i>=0;i--)
			if(delta & (1<<i)) a = fa[a][i];
//		printf("\n");
		if(a == b){
			printf("%d\n",a);
			continue;
		}
		for(int i=19;i>=0;i--){
			if(!fa[a][i] && !fa[b][i] && fa[a][i] != fa[b][i])
				a = fa[a][i], b = fa[b][i];
		}
		printf("%d\n",fa[a][0]);
	}
	return 0;
}
2021/10/2 09:25
加载中...