解题思路:
注意事项:
参考代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 100010
#define maxq 100010
int q,n;
int fa[maxn][20];
int dep[maxn];//每个点的深度,根节点的深度为1
int lg2[maxn];//lg2[i]就是log2(i)向下取整
vector<int> tu[maxn];
void dfs(int root,int father){
fa[root][0]=father;
dep[root]=dep[father]+1;
for(int i=1;i<=lg2[dep[root]];i++){
fa[root][i]=fa[fa[root][i-1]][i-1];
}
for(auto v:tu[root]){
dfs(v,root);
}
}
bool check(int x,int y){
while(dep[y]>dep[x]){
y=fa[y][lg2[dep[y]-dep[x]]];
}
if(x==y)return 1;
return 0;
}
int main(){
scanf("%d%d",&n,&q);
int u,v;
for(int i=1;i<n;i++){
scanf("%d%d",&u,&v);
tu[u].push_back(v);
}
lg2[0]=-999999;
lg2[1]=0;
for(int i=2;i<=n;i++){
lg2[i]=lg2[i-1]+(1<<(lg2[i-1]+1)==i);
}
dfs(1,0);
int x,y;
while(q--){
scanf("%d%d",&x,&y);
if(check(x,y))printf("YES\n");
else printf("NO\n");
}
system("pause");
return 0;
}
0.0分
2 人评分
输出正反三角形 (C语言代码)格式错误!!!浏览:1141 |
C语言程序设计教程(第三版)课后习题7.5 (C语言代码)浏览:524 |
printf基础练习2 (有点不明白)浏览:845 |
WU-复数求和 (C++代码)浏览:2015 |
C语言训练-求s=a+aa+aaa+aaaa+aa...a的值 (C语言代码)浏览:691 |
简单的a+b (C语言代码)浏览:632 |
WU-拆分位数 (C++代码)浏览:787 |
C语言程序设计教程(第三版)课后习题9.4 (C语言代码)浏览:667 |
DNA (C语言代码)浏览:750 |
C语言程序设计教程(第三版)课后习题7.4 (C语言代码)浏览:512 |