TLE两点求助
查看原帖
TLE两点求助
1278346
wanmingxing楼主2025/8/4 14:54
#include <bits/stdc++.h>
using namespace std;
const long long N=500005;
vector <long long> g[N];
long long parent[N][20];
long long depth[N];
void dfs(long long u,long long p)
{
	parent[u][0]=p;
	depth[u]=depth[p]+1;
	for(long long k=1;k<20;k++)
	{
		parent[u][k]=parent[parent[u][k-1]][k-1];
	}
	for(auto v:g[u])
	{
		if(v!=p)
		{
			dfs(v,u);
		}
	}
}
long long lca(long long u,long long v)
{
	if(depth[u]<depth[v]) swap(u,v);
	for(long long k=19;k>=0;k--)
	{
		if(depth[parent[u][k]]>=depth[v])
		{
			u=parent[u][k];
		}
	}
	if(u==v)
	{
		return u;
	}
	for(long long k=19;k>=0;k--)
	{
		if(parent[u][k]!=parent[v][k])
		{
			u=parent[u][k];
			v=parent[v][k];
		}
	}
	return parent[u][0];
}
long long getdist(long long u,long long v)
{
	return depth[u]+depth[v]-2*depth[lca(u,v)];
}
int main()
{
	ios::sync_with_stdio(false);
    cin.tie(0);
	long long n,m;
	cin>>n>>m;
	long long a,b;
	for(long long i=1;i<n;i++)
	{
		cin>>a>>b;
		g[a].push_back(b);
		g[b].push_back(a);
	}
	dfs(1,0);
	for(long long i=1;i<=m;i++)
	{
		long long x,y,z;
		cin>>x>>y>>z;
		long long l1=lca(x,y);
		long long l2=lca(x,z);
		long long l3=lca(y,z);
		long long p;
        if(depth[l1]>depth[l2]) 
		{
            p=l1;
        } 
		else 
		{
            p=l2;
        }
        if(depth[l3]>depth[p]) 
		{
            p=l3;
        }
		long long c=getdist(x,p)+getdist(y,p)+getdist(z,p);
		cout<<p<<" "<<c<<endl;
	}
	return 0;
}

不是两个点tle什么鬼?

2025/8/4 14:54
加载中...