【求助dalao!】倍增LCA 样例过 全WA 求助!!!
查看原帖
【求助dalao!】倍增LCA 样例过 全WA 求助!!!
376970
fishPJ楼主2023/1/10 19:56

代码如下啊啊啊

#include <bits/stdc++.h>
#define f(i,a,b) for(register int i=a;i<=b;i++)
#define f2(i,a,b) for(register int i=a;i>=b;i--)
#define RD read()
#define RE register
#define IL inline
using namespace std;
typedef long long ll;
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<<1)+(x<<3)+(ch^48); ch=getchar();}
	return x*f;
}
int const N=1e5+5;
int n,q;
int h[N],to[2*N],nxt[2*N],cnt;
IL int add_edge(int u,int v){
	to[++cnt]=v;
	nxt[cnt]=h[u];
	h[u]=cnt;
}
int dep[N],f[N][20];
IL void dfs(int u,int pre){
	dep[u]=dep[pre]+1;
	f[u][0]=pre;
	f(i,2,20) f[u][i]=f[f[u][i-1]][i-1];
	for(RE int e=h[u];e;e=nxt[e]){
		int v=to[e];
		if(v==pre) continue;
		dfs(v,u);
	}
}
IL int LCA(int x,int y){
	if(dep[x]<dep[y]) swap(x,y);
	f2(i,20,0){
		if(x==y) return x;
		if(dep[f[x][i]]>=dep[y]) x=f[x][i];
		if(dep[x]==dep[y]) break;
	}
	f2(i,20,0) if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
	return f[x][0];
}
IL int dis(int x,int y){
	int k=LCA(x,y);
	return abs(dep[x]-dep[k])+abs(dep[y]-dep[k]);
}
int main() {
	ios::sync_with_stdio(false);
	n=RD,q=RD;
	f(i,1,n-1){
		int u=RD,v=RD;
		add_edge(u,v);
		add_edge(v,u);
	}
	dfs(1,1);
//	printf("LCA 1,1=%d\n",LCA(1,1));
	while(q--){
		int u1=RD,v1=RD,u2=RD,v2=RD;
		int k1=LCA(u1,v1),k2=LCA(u2,v2);
//		printf("*************************\n1. LCA of %d and %d is %d.\n2. LCA of %d and %d is %d.\n",u1,v1,k1,u2,v2,k2);
		if(dis(u1,k2)+dis(k2,v1)==dis(u1,v1) || dis(u2,k1)+dis(k1,v2)==dis(u2,v2))
			printf("Y\n");
		else printf("N\n");
//		printf("[%d,%d]=%d [%d,%d]=%d [%d,%d]=%d\n[%d,%d]=%d [%d,%d]=%d [%d,%d]=%d\n",u1,k2,dis(u1,k2),k2,v1,dis(k2,v1),u1,v1,dis(u1,v1),u2,k1,dis(u2,k1),k1,v2,dis(k1,v2),u2,v2,dis(u2,v2));
	}
	return 0;
}

2023/1/10 19:56
加载中...