没有TLE/RE的风险,但是全WA,求助,悬关1(大号)
#include<bits/stdc++.h>
using namespace std;
const int size=5e5+5;
int n,m,x,y,z,ec,ans1,ans2,ans3,dm;
int head[size],f[size][25],dep[size];
struct edge{
int to,nxt;
}e[size*2];
void add(int x,int y)
{
e[++ec]={y,head[x]};
head[x]=ec;
}
void dfs(int u,int fa)
{
dep[u]=dep[fa]+1;
f[u][0]=fa;
for(int i=1;(1<<i)<=dep[u];i++)
f[u][i]=f[f[u][i-1]][i-1];
for(int i=head[u];i;i=e[i].nxt)
if(e[i].to!=fa)dfs(e[i].to,u);
}
int LCA(int x,int y)
{
if(dep[x]<dep[y])swap(x,y);
int cha=dep[x]-dep[y];
for(int i=0;(1<<i)<=cha;i++)
if(cha&(1<<i))x=f[x][i];
if(x==y)return x;
for(int i=dm;i>=0;i--)
if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
return f[x][0];
}
int dis(int x,int y)
{
int t=LCA(x,y);
return dep[x]+dep[y]-2*dep[t];
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
add(x,y); add(y,x);
}
dfs(1,0);
for(int i=1;i<=n;i++)dep[i]--;
for(;(1<<dm)<=n;dm++);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
int g=LCA(x,y),h=LCA(y,z),w=LCA(x,z);
ans1=dep[x]+dep[y]-2*dep[g]+dis(g,z);
ans2=dep[y]+dep[z]-2*dep[h]+dis(h,x);
ans3=dep[x]+dep[z]-2*dep[w]+dis(w,y);
if(ans1<=ans2&&ans1<=ans2)printf("%d %d\n",g,ans1);
else if(ans2<=ans1&&ans2<=ans3)printf("%d %d\n",h,ans2);
else printf("%d %d\n",w,ans3);
}
return 0;
}