倍增,样例过了,时间也没超,具体表现:下载第一个点后在电脑上测试发现全部输出0
#include<bits/stdc++.h>
#define MAXN 500005
#define MAXLOG 21
using namespace std;
struct Edge{
int head[MAXN]{},to[MAXN]{},pre[MAXN]{},num=0;
void add(int H,int T)
{
to[++num]=T;
pre[num]=head[H];
head[H]=num;
}
}tree;
int anc[MAXN][MAXLOG+2],de[MAXN],ans[MAXN],i,n,m,s,u,v;
void dfs(int Now,int Last)
{
de[Now]=de[Last]+1;
for(int I=0;I<=MAXLOG;I++)anc[Now][I+1]=anc[anc[Now][I]][I];
for(int I=tree.head[Now];I;I=tree.pre[I])
{
anc[tree.to[I]][0]=Now;
dfs(tree.to[I],Now);
}
}
int lca(int A,int B)
{
if(de[A]<de[B])swap(A,B);
for(int I=MAXLOG;I>=0;I--)
{
if(de[anc[A][I]]>=de[B])A=anc[A][I];
if(A==B)return A;
}
for(int I=MAXLOG;I>=0;I--)
{
if(anc[A][I]!=anc[B][I])
{
A=anc[A][I];
B=anc[B][I];
}
}
return anc[A][0];
}
int main()
{
cin>>n>>m>>s;
for(i=0;i<=MAXLOG;i++)anc[s][i]=1;
for(i=1;i<n;i++)
{
scanf("%d%d",&v,&u);
anc[v][0]=u;
tree.add(u,v);
}
dfs(s,0);
for(i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
ans[i]=lca(u,v);
}
for(i=1;i<=m;i++)printf("%d\n",ans[i]);
return 0;
}