RT,竟然T了两个点,臭 恶 代 码
#include<bits/stdc++.h>
using namespace std;
struct tree
{
int d;
int fa[22];
vector<int> next;
}a[500002];
int root;
int n,m;
int vis[500002];
void DFS(int now,int last)
{
/* if(vis[now])
return ; //大家说是这种方法快
vis[now]=1;
*/ a[now].d=a[last].d+1;
a[now].fa[0]=last;
int i;
for(i=1;(1<<i)<=a[now].d;i++)
a[now].fa[i]=a[a[now].fa[i-1]].fa[i-1];
for(i=0;i<a[now].next.size();i++){
int nt=a[now].next[i];
if(nt!=last) //还是这种快??
DFS(nt,now);
}
}
int LCA(int u,int v)
{
int du=a[u].d,dv=a[v].d;
int i;
if(du!=dv){
if(du<dv){
swap(u,v);
swap(du,dv);
}
int c=du-dv;
for(i=0;i<=ceil(log2(n));i++)
if((1<<i)&c)
u=a[u].fa[i];
}
if(u==v) return u;
for(i=log2(n);i>=0;i--){
if(a[a[u].fa[i]].d<=0)
continue;
if(a[u].fa[i]==a[v].fa[i])
continue;
else{
u=a[u].fa[i];
v=a[v].fa[i];
}
}
return a[u].fa[0];
}
int main()
{
// memset(vis,0,sizeof(vis));
cin>>n>>m>>root;
int i;
for(i=1;i<n;i++){
int u,v;
cin>>u>>v;
a[u].next.push_back(v);
a[v].next.push_back(u);
}
DFS(root,0);
for(i=1;i<=m;i++){
int u,v;
cin>>u>>v;
cout<<LCA(u,v)<<endl;
}
return 0;
}
另附O2 70分的测试