题目链接
思路:如果x是最近公共祖先,输出1
如果y是最近公共祖先,输出2
其他 0
#include<bits/stdc++.h>
using namespace std;
const int N=4e4+10;
const int maxbit=20;
vector<int> G[N];
int dep[N];
int father[N][maxbit];
int lg[N];
int n,m,x,y,root;
void dfs(int now,int fa){
dep[now]=dep[fa]+1;
father[now][0]=fa;
for(int i=1;i<=lg[dep[now]]+1;i++){
father[now][i]=father[father[now][i-1]][i-1];
}
for(int i=0;i<G[now].size();i++){
if(G[now][i]!=fa){
dfs(G[now][i],now);
}
}
}
int lca(int u,int v){
if(dep[u]<dep[v]) swap(u,v);
while(dep[u]!=dep[v]){
u=father[u][lg[dep[u]-dep[v]]];
}
if(u==v) return u;
for(int i=lg[dep[u]];i>=0;i--){
if(father[u][i]!=father[v][i]){
u=father[u][i];
v=father[v][i];
}
}
return father[u][0];
}
int main(){
lg[0]=-1;
for(int i=1;i<N;i++){
lg[i]=lg[i>>1]+1;
}
cin>>n;
for(int i=0;i<n;i++){
cin>>x>>y;
if(y==-1) root=x;
else{
G[x].push_back(y);
G[y].push_back(x);
}
}
dfs(root,0);
cin>>m;
for(int i=0;i<m;i++){
cin>>x>>y;
int LCA=lca(x,y);
if(LCA==x) cout<<1<<endl;
else if(LCA==y) cout<<2<<endl;
else cout<<0<<endl;
}
}