题目链接:Codeforces -1-Trees and Queries
显然是与奇偶路径有关。
当且仅当,图中存在奇环,才能改变奇偶性。所以判断距离长度,以及奇偶性即可。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=1e5+10;
int n,m,f[N][20],h[N],lg[N],d[N],q;
vector<int> g[N];
inline void add(int a,int b){g[a].push_back(b),g[b].push_back(a);}
void dfs(int x,int fa){
h[x]=h[fa]+1; f[x][0]=fa;
for(int i=1;(1<<i)<=h[x];i++) f[x][i]=f[f[x][i-1]][i-1];
for(auto to:g[x])
if(to!=fa) d[to]=d[x]+1,dfs(to,x);
}
inline int lca(int x,int y){
if(h[x]<h[y]) swap(x,y);
while(h[x]>h[y]) x=f[x][lg[h[x]-h[y]]-1];
if(x==y) return x;
for(int i=lg[h[x]]-1;i>=0;i--)
if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
return f[x][0];
}
inline int dis(int x,int y){return d[x]+d[y]-2*d[lca(x,y)];}
signed main(){
cin>>n;
for(int i=1;i<=n;i++) lg[i]=lg[i-1]+(1<<lg[i-1]==i);
for(int i=1,x,y;i<n;i++) scanf("%d %d",&x,&y),add(x,y);
cin>>q; dfs(1,1);
while(q--){
int x,y,a,b,k; scanf("%d %d %d %d %d",&x,&y,&a,&b,&k);
int dab=dis(a,b),dxy=dis(x,y);
int mi=dis(a,x)+1+dis(y,b);
mi=min(mi,dis(a,y)+1+dis(x,b));
if(k==1){
if(dab==1||mi==1) puts("YES");
else puts("NO"); continue;
}
if(a==b){
if(k%2==0) puts("YES");
else{
if((mi&1)&&mi<=k) puts("YES");
else puts("NO");
}
continue;
}
if(min(dab,mi)>k){puts("NO"); continue;}
if(mi==k||dab==k){puts("YES"); continue;}
if(dxy&1){
if(mi%2==k%2&&min(dab,mi)<=k) puts("YES");
else puts("NO"); continue;
}
if(mi<=k&&mi%2==k%2){puts("YES"); continue;}
if(dab<=k&&dab%2==k%2) puts("YES");
else puts("NO");
}
return 0;
}