0分求调
查看原帖
0分求调
765061
AsiraeM楼主2022/10/31 07:58

倍增,样例过了,时间也没超,具体表现:下载第一个点后在电脑上测试发现全部输出0

#include<bits/stdc++.h>
#define MAXN 500005
#define MAXLOG 21
using namespace std;
struct Edge{
	int head[MAXN]{},to[MAXN]{},pre[MAXN]{},num=0;
	void add(int H,int T)
	{
		to[++num]=T;
		pre[num]=head[H];
		head[H]=num;
	}
}tree;
int anc[MAXN][MAXLOG+2],de[MAXN],ans[MAXN],i,n,m,s,u,v;
void dfs(int Now,int Last)
{
	de[Now]=de[Last]+1; 
    for(int I=0;I<=MAXLOG;I++)anc[Now][I+1]=anc[anc[Now][I]][I];
    for(int I=tree.head[Now];I;I=tree.pre[I])
    {
        anc[tree.to[I]][0]=Now;
        dfs(tree.to[I],Now);
    }
}
int lca(int A,int B)
{
	if(de[A]<de[B])swap(A,B);
    for(int I=MAXLOG;I>=0;I--)
    {
		if(de[anc[A][I]]>=de[B])A=anc[A][I];
    	if(A==B)return A;
    }
    for(int I=MAXLOG;I>=0;I--)
    {
        if(anc[A][I]!=anc[B][I]) 
        { 
            A=anc[A][I];
            B=anc[B][I];
        }
    }
	return anc[A][0];
}
int main()
{
	cin>>n>>m>>s;
	for(i=0;i<=MAXLOG;i++)anc[s][i]=1;
	for(i=1;i<n;i++)
	{
		scanf("%d%d",&v,&u);
		anc[v][0]=u;
		tree.add(u,v);
	}
	dfs(s,0);
	for(i=1;i<=m;i++)
	{
		scanf("%d%d",&u,&v);
		ans[i]=lca(u,v);
	}
	for(i=1;i<=m;i++)printf("%d\n",ans[i]);
	return 0;
}
2022/10/31 07:58
加载中...