简单说一下我的思路,有没有dalao帮忙看看有没有缺漏或者错误?
查看原帖
简单说一下我的思路,有没有dalao帮忙看看有没有缺漏或者错误?
85182
暗影刀锋楼主2020/11/19 12:04

题目的样例过了,但是全WA,下载数据看了看,答案有些对的有些错的。

我的想法是:

1、先算ab和cd的lca,分别是x节点和y节点;

2、再比较xy的深度;

3、若是x的深度更深,则lca(x,c)==x||lca(x,d)==x;

4、若是y的深度更深,则lca(y,a)==y||lca(y,b)==y;

会有什么问题吗?

下面是我的代码。如果思路没有问题,那是代码有问题吗?

#include <bits/stdc++.h>
using namespace std;
#define For(i,a,b) for(int i=(a);i<=(int)(b);i++)
const int N=1e5+10;
struct node{
	int next,to;
}edge[N<<1];
int n,m,u,v,a,b,c,d,x,y,n_e=0,head[N<<1]={0},f[N<<1][30],de[N<<1];
bool ans[N<<1]={false};
inline void Add(int from,int to){
	edge[++n_e].next=head[from];
	edge[n_e].to=to;
	head[from]=n_e;
}
void dfs(int now,int fa,int dep){
	f[now][0]=fa;
	de[now]=dep;
	for(int i=head[now];i;i=edge[i].next){
		if(edge[i].to^fa){
			dfs(edge[i].to,now,dep+1);
		}
	}
}
inline int Up(int one,int two){
	if(de[one]<de[two]){
		swap(one,two);
	}
	for(int i=20;i>=1;i--){
		if(f[one][i]&&de[f[one][i]]>=de[two]){
			one=f[one][i];
		}
	}
	if(one==two){
		return one;
	}
	for(int i=20;i>=1;i--){
		if(f[one][i]&&f[one][i]^f[two][i]){
			one=f[one][i];
			two=f[two][i];
		}
	}
	return f[one][0];
}
int main(){
	freopen("test.in","r",stdin);
	freopen("test.out","w",stdout);
	scanf("%d%d",&n,&m);
	For(i,1,n-1){
		scanf("%d%d",&u,&v);
		Add(u,v);
		Add(v,u);
	}
	dfs(1,0,1);
	For(i,1,20){
		For(j,1,n){
			f[j][i]=f[f[j][i-1]][i-1];
		}
	}
	For(i,1,m){
		scanf("%d%d%d%d",&a,&b,&c,&d);
		x=Up(a,b);
		y=Up(c,d);
		//printf("de[%d]==%d,de[%d]==%d\n",x,de[x],y,de[y]);
		if(x==y){
			ans[i]=true;
		}
		if(de[x]>de[y]){
			if(Up(x,c)==x||Up(x,d)==x){
				//printf("qwer\n");
				ans[i]=true;
			}
		}
		if(de[x]<de[y]){
			if(Up(y,a)==y||Up(y,b)==y){
				//printf("rewq\n");
				ans[i]=true;
			}
		}
	}
	For(i,1,m){
		if(ans[i]){
			printf("Y\n");
		}else{
			printf("N\n");
		}
	}
	return 0;
}

希望有dalao能帮我看看,感激不尽!

2020/11/19 12:04
加载中...