LCA 模板求调!
查看原帖
LCA 模板求调!
727871
lizhehao2009楼主2024/7/22 16:49

只通过了 SubTask 0,SubTask 1 一个点都没过,敬请各位大佬鼎力相助!(我是蒟蒻)

#include<bits/stdc++.h>
#define ll long long
#define left(x,y) ((x)<<(y))
#define right(x,y) ((x)>>(y))
#define p1 ((p)<<1)
#define p2 ((p)<<1|1)
using namespace std;
const int MAXN=5e5+10;
struct node
{
    int next,to;
};
node a[left(MAXN,1)];
int head[MAXN],father[MAXN],deep[MAXN],dis[MAXN],f[MAXN][30];
int cnt=0;
inline int read()
{
	int res=0,flag=1;
	char c=getchar();
	while (c<'0'||c>'9')
	{
		if (c=='-')
		{
			flag=-1;
		}
		c=getchar();
	}
	while (c>='0'&&c<='9')
	{
		res=left(res,3)+left(res,1)+(c^48);
		c=getchar();
	}
	return res*flag;
}
inline void write(ll x)
{
	if (x<0)
	{
		putchar('-');
		x=-x;
	}
	if (x>9)
	{
		write(x/10);
	}
	putchar(x%10+'0');
}
void add(int from_,int to_)
{
    cnt++;
    a[cnt]=(node){head[from_],to_};
    head[from_]=cnt;
}
void dfs(int x,int y)
{
    int id=head[x];
    father[x]=y;
    while (id!=-1)
    {
        if (a[id].to==y)
        {
            id=a[id].next;
            continue;
        }
        deep[a[id].to]=deep[x]+1;
        dis[a[id].to]=dis[x];
        dfs(a[id].to,x);
        id=a[id].next;
    }
}
int LCA(int x,int y)
{
    if (deep[x]<deep[y])
    {
        swap(x,y);
    }
    for (int i=20;i>=0;i--)
    {
        if (deep[f[x][i]]>=deep[y])
        {
            x=f[x][i];
        }
    }
    if (x==y)
    {
        return x;
    }
    for (int i=20;i>=0;i--)
    {
        if (f[x][i]!=f[y][i])
        {
            x=f[x][i];
            y=f[y][i];
        }
    }
    return father[x];
}
void DP(int n)
{
    for (int i=1;i<=n;i++)
    {
        f[i][0]=father[i];
    }
    for (int j=1;j<16;j++)
    {
        for (int i=1;i<=n;i++)
        {
            f[i][j]=f[f[i][j-1]][j-1];
        }
    }
}
int main()
{
	int n,m,s,x,y;
    n=read();
    m=read();
    s=read();
    memset(head,-1,sizeof(head));
    for (int i=1;i<n;i++)
    {
        x=read();
        y=read();
        add(x,y);
        add(y,x);
    }
    deep[s]=1;
    dfs(s,0);
    DP(n);
    while (m--)
    {
        x=read();
        y=read();
        if (x==y)
        {
            write(x);
            putchar('\n');
            continue;
        }
        write(LCA(x,y));
        putchar('\n');
    }
	return 0;
}
2024/7/22 16:49
加载中...