题目大意
据说银河是一个树形结构,共有 N N N 个星球,每到七夕时,喜鹊会在星球之间搭起桥,共有 N − 1 N−1 N−1 座鹊桥。
牛郎和织女就会从两个不同的位置出发,沿着最短路相向而行,并在途中相会。
假设通过每一座鹊桥的时间都是相等的(通过星球的时间忽略不计),给出牛郎织女出发的位置,问他们相遇的地点是在星球上,还是在鹊桥上?
输入格式
第一行输入两个正整数 N , Q N,Q N,Q ,分别表示星球的数量和询问的数量。
之后 N − 1 N-1 N−1 行,每行两个数 u , v u,v u,v ,表示星球 u , v u,v u,v 间有一座鹊桥。
之后 Q Q Q 行,每行两个数 c , d c,d c,d ,对应 Q Q Q 个询问中,牛郎与织女的起始位置。
输出格式
输出共 Q Q Q 行,对应 Q Q Q 个询问的答案,如果相遇在鹊桥上,输出 “ Y Y Y” ,否则输出" N N N" 。
输入样例
4 1
1 2
2 3
2 4
1 2
输出样例
Y
基本思路
我们首先思考什么时候相遇在鹊桥上,什么时候在星球上呢?十分简单,经过鹊桥为奇数时在鹊桥上,偶数时在星球上。
这么来看这应该是一个 L C A LCA LCA 问题,其实大可不必。我们需要的只是路径的奇偶性,所以我们可以处理每个点到根节点的长度相加模 2 2 2 即可,因为他们在通往根节点的公共路径是重合的,相加为偶数,模 2 2 2 后会被消掉。
核心代码
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int N=1e5+10;
int n,q,dis[N],s,t;
vector<int>e[N];
inline void dfs(int p,int f){dis[p]=dis[f]+1;for(auto v:e[p]){if(v==f) continue;dfs(v,p);}
}
int main(){ios::sync_with_stdio(false);cin>>n>>q;for(int i=1,u,v;i<n;i++){cin>>u>>v;e[u].push_back(v);e[v].push_back(u);}dfs(1,0);while(q--){cin>>s>>t;if((dis[s]+dis[t])%2==0)cout<<"N"<<endl;elsecout<<"Y"<<endl; }return 0;
}