求助,莫名其妙CE,本机AC
查看原帖
求助,莫名其妙CE,本机AC
453762
天下人间楼主2021/10/30 11:23
#include <iostream>
#include <cstdio>
#include <queue>
#define int long long
using namespace std;
struct bia
{
    int from=-1;
    int to=-1;
    int net=0;
}bian[1000001];
struct hed
{
    int fir=-1;
    int num=0;
    int last=-1;
}head[500001];
int p=0;
void lian(int a,int b)
{
    p++;
    if(head[a].num)
    {
        bian[head[a].last].net=p;
        head[a].num++;
        head[a].last=p;
        bian[p].from=a;
        bian[p].to=b;
    }
    else
    {
        head[a].num++;
        head[a].fir=p;
        bian[p].from=a;
        bian[p].to=b;
        head[a].last=p;
    }
}
int dep[500001]={};
int dp[500001][22]={};
void dealf(int u,int fa)
{
    //printf("%d %d\n",u,fa);
    dep[u]=dep[fa]+1;
    //printf("%d %d %d\n\n",u,fa,dep[u]);
    for(int i=0;i<=19;i++)
    {
        dp[u][i+1]=dp[dp[u][i]][i];
    }

    for(int i=head[u].fir;i;i=bian[i].net)
    {
        int x=bian[i].to;
        if(x==fa)
            continue;
        dp[x][0]=u;
        dealf(x,u);
    }
}
int findlca(int x,int y)
{
    if(dep[x]<dep[y])
        swap(x,y);
    for(int i=20;i>=0;i--)
    {
        if(dep[dp[x][i]]>=dep[y])
            x=dp[x][i];
        if(x==y)
            return x;
    }
    for(int i=20;i>=0;i--)
    {
        if(dp[x][i]!=dp[y][i])
        {
            x=dp[x][i];
            y=dp[y][i];
        }
    }
    return dp[x][0];
}
#undef int
int main()
{
    #define int long long
    int n,m,s;
    scanf("%lld %lld %lld",&n,&m,&s);
    for(int i=1;i<=n-1;i++)
    {
        int a,b;
        scanf("%lld %lld",&a,&b);
        lian(a,b);
        lian(b,a);
    }

    dealf(s,0);
 /*   for(int i=1;i<=n;i++)
    {
        printf("%d ",dep[i]);
    }*/
    for(int i=1;i<=m;i++)
    {
        int a,b;
        scanf("%lld %lld",&a,&b);
        printf("%lld\n",findlca(a,b));
    }
    return 0;
}

2021/10/30 11:23
加载中...