蒟蒻求助
查看原帖
蒟蒻求助
110694
ChengZe楼主2020/7/22 10:45

就对了测试点8、9(神奇)

#include <bits/stdc++.h>
using namespace std;
const int maxn=5e5+10;
int n,q;
int Head[maxn],Next[maxn<<1],to[maxn<<1],tot;
int k,anc[maxn][20],dep[maxn];
void add(int u,int v){
	++tot;
	Next[tot]=Head[u];
	Head[u]=tot;
	to[tot]=v;
}

void dfs(int u,int fa,int d){
	dep[u]=d;anc[u][0]=fa;
	for(int i=Head[u];i;i=Next[i]){
		int v=to[i];
		if(v==fa)continue;
		dfs(v,u,d+1);
	}
}

void doit(){
	for(int u=1;u<=n;u++)
	for(int i=1;i<=k;i++)anc[u][i]=anc[anc[u][i-1]][i-1];
}

int lca(int u,int v){
	if(dep[u]<dep[v])swap(u,v);
	for(int i=k;i>=0;i--)if(dep[anc[u][i]]>=dep[v])u=anc[u][i];
	if(u==v)return u;
	for(int i=k;i>=0;i--)if(anc[u][i]!=anc[v][i])u=anc[u][i],v=anc[v][i];
	return anc[u][0];
}

int main()
{
	scanf("%d%d",&n,&q);
	k=log2(n);
	for(int i=1;i<n;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		add(u,v);add(v,u);
	}
	dfs(1,1,0);
	doit();
	while(q--){
		int i,j,k,t1,t2,t3;scanf("%d%d%d",&i,&j,&k);
		t1=lca(i,j);t2=lca(j,k);t3=lca(i,k);
		int all=dep[i]+dep[j]+dep[k]-dep[t1]-dep[t2]-dep[t3];
		if(t1==t2&&t2==t3)printf("%d %d",t1,all);
		else if(t1==t2)printf("%d %d",t3,all);
		else if(t2==t3)printf("%d %d",t1,all);
		else if(t1==t3)printf("%d %d",t2,all);
		printf("\n");
	}
	return 0;
}
2020/7/22 10:45
加载中...