样例过了,但全WA
查看原帖
样例过了,但全WA
421421
Rem_CandleFire楼主2023/7/18 20:54

没有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;
}

2023/7/18 20:54
加载中...