Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
167809 | 周子隽 | 紧急集合 | C++ | 输出超限 | 0 | 643 MS | 133592 KB | 1152 | 2024-08-19 18:03:52 |
#include<bits/stdc++.h> using namespace std; #define N 500005 struct ji{ int nex,to; }edge[N<<1]; int E,n,m,x,y,z,head[N],in[N],out[N],s[N],f[N][21]; bool pd(int x,int y){ return (in[x]<=in[y])&&(out[y]<=out[x]); } int lca(int x,int y){ if (pd(x,y))return x; for(int i=20;i>=0;i--) if (!pd(f[x][i],y))x=f[x][i]; return f[x][0]; } int len(int x,int y){ return s[x]+s[y]-2*s[lca(x,y)]; } void add(int x,int y){ edge[E].nex=head[x]; edge[E].to=y; head[x]=E++; } void dfs(int k,int fa,int sh){ in[k]=++x; s[k]=sh; f[k][0]=fa; for(int i=1;i<=20;i++)f[k][i]=f[f[k][i-1]][i-1]; for(int i=head[k];i!=-1;i=edge[i].nex) if (edge[i].to!=fa)dfs(edge[i].to,k,sh+1); out[k]=++x; } int main(){ scanf("%d%d",&n,&m); memset(head,-1,sizeof(head)); for(int i=1;i<n;i++){ scanf("%d%d",&x,&y); add(x,y); add(y,x); } x=0; dfs(1,1,0); for(int i=1;i<=m;i++){ scanf("%d%d%d",&x,&y,&z); int k=(lca(x,y)^lca(x,z)^lca(y,z)); printf("%d %d\n",k,len(x,k)+len(y,k)+len(z,k)); } }