萌新刚学OI LCA倍增做法全0RE 求调
查看原帖
萌新刚学OI LCA倍增做法全0RE 求调
766022
__pipi__楼主2024/8/4 14:29
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=5e5+5;
int n,t;
int dep[N],fa[N][25];
int head[N],nex[N<<1],ver[N<<1],tot=1;
int add(int x,int y) {
	ver[++tot]=y;
	nex[tot]=head[x];
	head[x]=tot;
}
void dfs(int x,int father) {
	dep[x]=dep[father]+1;
	fa[x][0]=father;
	for(int i=1;i<20;i++) {
		fa[x][i]=fa[fa[x][i-1]][i-1];
	}
	for(int i=head[x];i;i=nex[i]) {
		int y=ver[i];
		if(y==father) continue;
		dfs(y,x);
	}
}
int lca(int x,int y) {
	if(dep[x]<dep[y]) swap(x,y);
	int len=dep[x]-dep[y];
	for(int i=19;i>=0;i--) {
		if((len>>i)&1) x=fa[x][i];
	}
	if(x==y) return x;
	for(int i=19;i>=0;i--) {
		if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
	}
	return fa[x][0];
}
int ee(int x,int y) {
	int e=lca(x,y);
	return abs(dep[x]-dep[e])+abs(dep[y]-dep[e]);
}
int main() {
	cin>>n>>t;
	for(int i=1;i<n;i++) {
		int x,y;
		cin>>x>>y;
		add(x,y);
		add(y,x);
	}
	dfs(1,1);	
	while(t--) {
		int a,b,c,d;
		cin>>a>>b>>c>>d;
		int k=lca(a,b),l=lca(c,d);
		if(ee(a,l)+ee(l,b)==ee(a,b)||ee(c,k)+ee(k,d)==ee(c,d)) cout<<"Y\n";
		else cout<<"N\n";
	}
 	return 0;
}

2024/8/4 14:29
加载中...