本地和洛谷在线IDE自测都没有问题(样例和测试点1),提交则为WA+RE,求找UB。
#include <cstdio>
//倍增LCA
struct edge
{
int to,nex;
};
edge a[1000010];
int head[500010],cnt;
void add(int u,int v)
{
a[++cnt].to=v;
a[cnt].nex=head[u];
head[u]=cnt;
}
int swp(int &x,int &y)
{int c;c=x;x=y;y=c;}
int dep[500010],fa[500010][23];
int lg[500010];
int N,M,root;
void dfs(int p,int fat)
{
fa[p][0]=fat;
dep[p]=dep[fat]+1;
int i;
for(i=1;i<=lg[dep[p]];i++)
fa[p][i]=fa[fa[p][i-1]][i-1];
for(i=head[p];i;i=a[i].nex)
if(a[i].to!=fat)
dfs(a[i].to,p);
return;
}
int LCA(int x,int y)
{
int i,w;
if(dep[x]<dep[y])
swp(x,y);
w=dep[x]-dep[y];
for(i=0;i<=lg[w]+1;i++)
if(w&(1<<i))
x=fa[x][i];
if(x==y)
return x;
for(i=lg[N];i>=0;i--)
{
if(fa[x][i]!=fa[y][i])
{
x=fa[x][i];
y=fa[y][i];
}
}
return fa[x][0];
}
int main()
{
int i,j,k;
scanf("%d%d%d",&N,&M,&root);
lg[1]=0;lg[2]=1;
for(i=3;i<=N+8;i++)
lg[i]=lg[i>>1]+1;
for(i=1;i<N;i++)
{
scanf("%d%d",&j,&k);
add(j,k);
add(k,j);
}
dfs(root,0);
for(i=1;i<=M;i++)
{
scanf("%d%d",&j,&k);
printf("%d\n",LCA(j,k));
}
}
三次提交RE的点都不一样...谢谢大家了