Codeforces -1-Trees and Queries

题目链接: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;
}
发布了579 篇原创文章 · 获赞 242 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_43826249/article/details/104339340