树剖subtask1T3个点求调
查看原帖
树剖subtask1T3个点求调
228778
H2O_TX楼主2022/11/2 16:28
#include<bits/stdc++.h>
using namespace std;

inline int read()
{
    int s=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
    return s*w;
}

const int N = 5e5+10;
int n,m,rt;
int dfn[N],siz[N],top[N],hs[N],cnt,fa[N],dep[N];
int head[N],ne[N*2],ver[N*2],tot;

void add(int x,int y)
{
    ver[++tot]=y;
    ne[tot]=head[x];
    head[x]=tot;
}

void dfs1(int x,int f)
{
    dep[x]=dep[f]+1;
    fa[x]=f;
    siz[x]=1;
    int maxn=-1; 
    for(int i=head[x];i;i=ne[i])
    {
        int y=ver[i];
        if(y==f) continue;
        dfs1(y,x);
        if(siz[y]>maxn) hs[x]=y,maxn=siz[y];
    }
}
void dfs2(int x,int t)
{
    dfn[x]=++cnt;
    top[x]=t;
    if(hs[x]) dfs2(hs[x],t);
    else return ;
    for(int i=head[x];i;i=ne[i])
    {
        int y=ver[i];
        if(y==hs[x]||y==fa[x]) continue;
        dfs2(y,y);
    }
}

int getlca(int x,int y)
{
    while(top[x]!=top[y])
    {
        if(dep[top[x]]<dep[top[y]]) swap(x,y);
        x=fa[top[x]];
    }
    if(dep[x]<dep[y]) return x;
    return y;
}

int main()
{
    // ios::sync_with_stdio(0);
    // cin>>n>>m>>rt;
    n=read(),m=read(),rt=read();
    for(int i=1;i<n;i++)
    {
        int x=read(),y=read();
        // cin>>x>>y;
        add(x,y);
        add(y,x);
    }
    dfs1(rt,0);
    dfs2(rt,rt);
    while(m--)
    {
        int x=read(),y=read();
        printf("%d\n",getlca(x,y));
    }
    return 0;
}
2022/11/2 16:28
加载中...