社区讨论
TLE两点求助
P4281[AHOI2008] 紧急集合 / 聚会参与者 3已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @mdwr9qbv
- 此快照首次捕获于
- 2025/08/04 14:55 7 个月前
- 此快照最后确认于
- 2025/11/04 03:13 4 个月前
CPP
#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什么鬼?
回复
共 5 条回复,欢迎继续交流。
正在加载回复...