萌新妹子刚学OI性感LCA在线求调
查看原帖
萌新妹子刚学OI性感LCA在线求调
556545
_anll_楼主2023/12/20 21:50

rt,本人同学交此版代码全部MLE,十分不解,求解答

#include<iostream>
#include<vector>
#define N 1000005
using namespace std;
vector<int> r[N];
int n,m,k,dep[N],siz[N],son[N],top[N],fa[N];
void dfs(int u,int faa){
	dep[u]=dep[faa]+1;
	fa[u]=faa;
	siz[u]=1;
	for(auto v:r[u])if(v!=faa){
		dfs(v,u);
		siz[u]+=siz[v];
		if(siz[v]>siz[son[u]])son[u]=v;
	}
}void dfs2(int u,int faa){
	top[u]=faa;
	if(son[u]==0)return;
	dfs2(son[u],u);
	for(auto v:r[u])
	if(v!=faa&&v!=son[u])
		dfs2(v,v);
}int lca(int u,int v){
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]])u^=v,v^=u,u^=v;
		u=fa[top[u]];
	}return dep[u]<dep[v]?u:v;
}int jump(int uu,int u,int step){
	while(dep[uu]-dep[fa[top[u]]]<=step)u=fa[top[u]];
	while(dep[uu]-dep[fa[u]]<=step)u=fa[u];
	return u;
}int main(){
	scanf("%d%d%d",&n,&m,&k);
	for(int i=2,u,v;i<=n;i++){
		scanf("%d%d",&u,&v);
		r[u].push_back(v);
		r[v].push_back(u);
	}dfs(1,1);
	dfs2(1,1);
	for(int i=1,LCA,dis,d,t;i<=k;i++){
		scanf("%d%d",&d,&t);
		LCA=lca(m,d);dis=dep[m]+dep[d]-(dep[LCA]<<1);
		if(dis<=t)printf("%d ",d),m=d;
		else if(t==dep[m]-dep[LCA])printf("%d ",LCA),m=LCA;
		else if(t<dep[m]-dep[LCA]){
			m=jump(m,m,t);
			printf("%d ",m);
		}else{
			m=jump(d,d,dis-t);
			printf("%d ",m);
		}
	}return 0;
}
2023/12/20 21:50
加载中...