下面这份代码可以拿90:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <stdlib.h>
#include <stack>
#include <queue>
#define ri register int
inline int read() {
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=5e5+5,K=22;
int to[N<<1],nxt[N<<1],head[N],cnt=1;
int f[N][K],dep[N],n,m;
void edge_add(int u,int v){
to[cnt]=v,nxt[cnt]=head[u],head[u]=cnt++;
}
void dfs(int now,int fa){
dep[now]=dep[fa]+1,f[now][0]=fa;
for(ri i=1;i<=19;i++)f[now][i]=f[f[now][i-1]][i-1];
for(ri i=head[now];i;i=nxt[i]){
if(to[i]!=fa)dfs(to[i],now);
}
}
int lca(int x,int y){
if(dep[x]<dep[y])std::swap(x,y);
for(ri i=19;i>=0;i--)x=((dep[f[x][i]]>=dep[y])?f[x][i]:x);
if(x==y)return x;
for(ri i=19;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 l=lca(x,y);
return dep[x]+dep[y]-2*dep[l];
}
int main(){
n=read(),m=read();
for(ri i=1,u,v;i<n;u=read(),v=read(),edge_add(u,v),edge_add(v,u),i++);
dfs(1,0);
for(ri i=1;i<=n;i++)dep[i]--;
for(ri i=1;i<=m;i++){
int x=read(),y=read(),z=read(),la=lca(x,y),lb=lca(y,z),lc=lca(x,z);
if(la==lb)printf("%d %d\n",lc,dis(x,lc)+dis(y,lc)+dis(z,lc));
else if(la==lc)printf("%d %d\n",lb,dis(x,lb)+dis(y,lb)+dis(z,lb));
else if(lb==lc)printf("%d %d\n",la,dis(x,la)+dis(y,la)+dis(z,la));
}
return 0;
}
然鹅如果把
for(ri i=1;i<=n;i++)dep[i]--;
改成
for(ri i=0;i<=n;i++)dep[i]--;
就可以AC。
求助原因/kel