萌新求助
查看原帖
萌新求助
174897
zjrdmd楼主2021/2/1 15:58

下面这份代码可以拿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

2021/2/1 15:58
加载中...