用的是ST表的方法,准确的来说是样例都没过,没有找出来任何错误也不理解为什么会错
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10,M=5e5+10;
#define fo1(l,r) for(register int i=l;i<=r;i++)
#define fo2(l,r) for(register int j=l;j<=r;j++)
#define fo3(l,r) for(register int k=l;k<=r;k++)
#define fo4(l,r) for(register int tt=l;tt<=r;tt++)
#define re register
#define inf 0x3f3f3f3f
inline int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(isdigit(ch))
{
x=(x<<3)+(x<<1)+ch-48;
ch=getchar();
}
return x*f;
}
int n,m,st;
struct node
{
int from,to,last;
}x[M*2];
int s,h[N];
int ls1,ls2,ls3,ls4,ls;
int dep[N],now,maxn;
int fi[N];//表示首次遍历到i节点时的遍历次数
int f[M*2][50][2];//f是维护DFS的最小值 ,DFS储dfs序对应节点的dep值,该数组已省略 .0是值,1是下标
//在dfs中每条边都被"来回"走了两次,所以是2*M
inline void yadd(int xx)
{
f[++now][0][0]=dep[xx];
f[now][0][1]=xx;
return;
}
inline void dfs(int p)
{
yadd(p);
fi[p]=now;
for(re int i=h[p],go;i;i=x[i].last)
{
go=x[i].to;
if(!dep[go])
{
dep[go]=dep[p]+1;
dfs(go);
yadd(p);
}
}
return;
}
inline int yRMQ(int xx,int yy)
{
ls3=log(yy-xx+1)/log(2);
if(f[xx][ls3][0]<f[yy-(1<<ls3)+1][ls3][0])
{
return f[xx][ls3][1];
}
else
{
return f[yy-(1<<ls3)+1][ls3][1];
}
}
inline void swap(int &xx,int &yy)
{
xx^=yy;
yy^=xx;
xx^=yy;
return;
}
int main()
{
n=read();m=read();st=read();
fo1(1,n-1)
{
ls1=read();ls2=read();
x[++s].last=h[ls1];
x[s].from=ls1;
x[s].to=ls2;
h[ls1]=s;
x[++s].last=h[ls2];
x[s].from=ls2;
x[s].to=ls1;
h[ls2]=s;
}
dep[st]=1;
dfs(st);
//下面开始ST表的预处理
maxn=log(now)/log(2);
fo1(1,maxn)
{
ls1=n-((1<<i)-1);
fo2(1,ls1)
{
if(f[j][i-1][0]<f[j+(1<<(i-1))][i-1][0])
{
f[j][i][0]=f[j][i-1][0];
f[j][i][1]=f[j][i-1][1];
}
else
{
f[j][i][0]=f[j+(1<<(i-1))][i-1][0];
f[j][i][1]=f[j+(1<<(i-1))][i-1][1];
}
}
}
fo1(1,m)
{
ls1=read();ls2=read();
ls1=fi[ls1];ls2=fi[ls2];
if(ls1>ls2)
{
swap(ls1,ls2);
}
printf("%d\n",yRMQ(ls1,ls2));
}
return 0;
}