站外题求助
  • 板块灌水区
  • 楼主Ryan_jiang07
  • 当前回复1
  • 已保存回复1
  • 发布时间2021/10/17 16:45
  • 上次更新2023/11/4 03:29:16
查看原帖
站外题求助
401787
Ryan_jiang07楼主2021/10/17 16:45

题目大意:一棵树上(T次问询,每次)给出三个节点,求哪个点能让三点到这个点的距离和最短,输出这个点的编号和距离和最小值

哪位dalao能帮我康康问题出在哪

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=500009;
ll n,T,L,p[N][30],d[N],timer,tI[N],tO[N];
vector<ll> to[N];
void pre_dfs(ll u,ll fa){
	d[u]=d[fa]+1;
	tI[u]=++timer;
	p[u][0]=fa;
	for(ll i=1;i<=L;i++){
		p[u][i]=p[p[u][i-1]][i-1];
	}
	for(ll i=0;i<to[u].size();i++){
		ll v=to[u][i];
		if(v==fa) continue;
		pre_dfs(v,u);
	}
	tO[u]=++timer;
}
bool up(ll u,ll v){
	return tI[u]<=tI[v]&&tO[u]>=tO[v]||!u;
}
ll lca(ll u,ll v){
	if(up(u,v)) return u;
	if(up(v,u)) return v;
	for(ll i=L;i>=0;i--){
		if(!up(p[u][i],v)){
			u=p[u][i];
		}
	}
	return p[u][0];
}
ll dst(ll u,ll v){
	ll fa=lca(u,v);
	return d[u]+d[v]-2*d[fa];
}
int main(){
	freopen("bighead.in","r",stdin);
	freopen("bighead.out","w",stdout);
	cin>>n>>T;
	for(ll i=1,u,v;i<n;i++){
		cin>>u>>v;
		to[u].push_back(v);
		to[v].push_back(u);
	}
	L=log(n)/log(2)+1;
	pre_dfs(1,0);
	while(T--){
		ll x,y,z,ans;
		cin>>x>>y>>z;
		if(min(d[x],d[y])>=d[z]){
			ans=lca(x,y);
			cout<<ans<<" "<<dst(x,y)+dst(z,ans)<<endl; 
		}
		else if(min(d[x],d[z])>=d[y]){
			ans=lca(x,z);
			cout<<ans<<" "<<dst(x,z)+dst(y,ans)<<endl;
		}
		else if(min(d[y],d[z])>=d[x]){
			ans=lca(y,z);
			cout<<ans<<" "<<dst(y,z)+dst(x,ans)<<endl;
		}
	}
	return 0;
}

调了半天都wa,还不给输入输出样例,气死我了

2021/10/17 16:45
加载中...