塔建高数百,兴致次重发。池中蛙声尽入耳,心中之恼无人诉。
查看原帖
塔建高数百,兴致次重发。池中蛙声尽入耳,心中之恼无人诉。
658786
STUDENT00楼主2023/1/2 21:49

代码如下:

#include<bits/stdc++.h>
#define N 100005
using namespace std;
int n,q,f[N][20],h[N],lg[N];
vector<int> gg[N],g[N];
void dfs(int now,int fa){
	h[now]=h[fa]+1;
	for(int i=0;i<gg[now].size();i++){
		int t=gg[now][i];
		if(t!=fa){g[now].push_back(t);f[t][0]=now;dfs(t,now);}
	}
}
void init(){
	lg[0]=-1;
	for(int i=1;i<=n;i++) lg[i]=lg[i>>1]+1;
	for(int j=1;(1<<j)<=n;j++){
		for(int i=1;i+(1<<j)-1<=n;i++) f[i][j]=f[f[i][j-1]][j-1];
	}
}
int lca(int a,int b){
	if(h[a]<h[b]) swap(a,b);
	while(h[a]>h[b]) a=f[a][lg[h[a]-h[b]]];
	if(a==b) return a;
	for(int i=lg[h[a]];i>=0;i--){
		if(f[a][i]!=f[b][i]){a=f[a][i];b=f[b][i];}
	}
	return f[a][0];
}
int dis(int a,int b){
	return h[a]+h[b]-2*h[lca(a,b)];
}
int main(){
	scanf("%d%d",&n,&q);
	for(int i=1;i<n;i++){
		int x,y;scanf("%d%d",&x,&y);
		gg[x].push_back(y);gg[y].push_back(x);
	}
	dfs(1,0);         
	init();
	while(q--){
		int a,b,c,d;scanf("%d%d%d%d",&a,&b,&c,&d);
		int x=lca(a,b),y=lca(c,d);
		if(dis(a,y)+dis(y,b)==dis(a,b)||dis(c,x)+dis(x,d)==dis(c,d)) printf("Y\n");
		else printf("N\n");
	}
	return 0;
}
2023/1/2 21:49
加载中...