过了是过了,然而发现跑的很慢,就拿小号试了一发题解(qwq,这个不要举报了吧),然而时间是我的一半左右,那里写丑了?
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
#define read(x) scanf("%d",&x)
#define MAXN 500005
int top[MAXN],dep[MAXN],son[MAXN],vis[MAXN],f[MAXN],tot[MAXN];
struct node
{
int to,nxt;
}e[MAXN<<1];
int head[MAXN],cnt=0;
int n,m,root,l,r;
void add(int u,int v)
{
e[++cnt].to=v;
e[cnt].nxt=head[u];
head[u]=cnt;
}
int dfsa(int cur,int deep)
{
vis[cur]=1;
dep[cur]=deep;
tot[cur]=1;
son[cur]=0;
int maxn=0;
for(int i=head[cur];i;i=e[i].nxt)
{
int j=e[i].to;
if(vis[j]) continue;
f[j]=cur;
int now=dfsa(j,deep+1);
if(now>maxn) maxn=now,son[cur]=j;
tot[cur]+=now;
}
return tot[cur];
}
void dfsb(int cur,int topf)
{
vis[cur]=1;
top[cur]=topf;
if(son[cur]) dfsb(son[cur],topf);
for(int i=head[cur];i;i=e[i].nxt)
{
int j=e[i].to;
if(vis[j]) continue;
dfsb(j,j);
}
return;
}
int lca(int x,int y)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
x=f[top[x]];
}
return dep[x]<dep[y]?x:y;
}
int main()
{
read(n),read(m),read(root);
for(int i=1;i<n;i++)
{
read(l),read(r);
add(l,r),add(r,l);
}
memset(vis,0,sizeof(vis));
f[root]=root;
dfsa(root,1);
memset(vis,0,sizeof(vis));
dfsb(root,root);
for(int i=1;i<=m;i++)
{
read(l),read(r);
printf("%d\n",lca(l,r));
}
return 0;
}