求调
查看原帖
求调
1349424
Charlie_Nine楼主2025/8/5 10:02
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10;
int n,q,f[N][30],dep[N];
vector<int> e[N];
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 dfs(int u,int father){
	f[u][0]=father;
	dep[u]=dep[father]+1;
	for(auto i:e[u]){
		if(i!=father) dfs(i,u);
	}
}
int lca(int u,int v){
	if(dep[u]<dep[v]) swap(u,v);
	for(int i=22;i>=0;i--){
		if(dep[f[u][i]]>=dep[v]) u=f[u][i];
	}
	if(u==v) return u;
	for(int i=20;i>=0;i--){
		if(f[u][i]!=f[v][i]){
			u=f[u][i];
			v=f[v][i];
		}
	}
	return f[u][0];
}
int cf(int a,int b,int c,int d){
	int l_max=max({dep[lca(a,c)],dep[lca(a,d)],dep[lca(b,c)],dep[lca(b,d)]});
	if(l_max==dep[lca(a,c)]) return lca(a,c);
	if(l_max==dep[lca(a,d)]) return lca(a,d);
	if(l_max==dep[lca(b,c)]) return lca(b,c);
	if(l_max==dep[lca(b,d)]) return lca(b,d);
	return -1;
}
int main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	cin>>n>>q;
	for(int i=1;i<n;i++){
		int x=read(),y=read();
		e[x].push_back(y);
		e[y].push_back(x);
	}
	dfs(1,0);
	for(int j=1;(1<<j)<=n;j++){
		for(int i=1;i<=n;i++){
			f[i][j]=f[f[i][j-1]][j-1];
		}
	}
	for(int i=1;i<=q;i++){
		int a=read(),b=read(),c=read(),d=read();
		int l_1=lca(a,b),l_2=lca(c,d);
		int l_max=cf(a,b,c,d);
		if(dep[l_max]>dep[l_1]&&dep[l_max]>dep[l_2]){
			cout<<"Y\n";
		}else{
			cout<<"N\n";
		}
	}
	return 0;
}
//ycy951130
/*     orz
    orzorzorz
 orzorzorzorzorz*/

2025/8/5 10:02
加载中...