题目的样例过了,但是全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能帮我看看,感激不尽!