社区讨论

求助,倍增TLE3个点

P3379【模板】最近公共祖先(LCA)参与者 8已保存回复 9

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
9 条
当前快照
1 份
快照标识符
@mi6lfkwn
此快照首次捕获于
2025/11/20 06:48
4 个月前
此快照最后确认于
2025/11/20 06:48
4 个月前
查看原帖
cheeseYang2016gdgzoi334I_AM_HelloWord
CPP
#include<iostream>
#include<list>
using namespace std;
const int maxn=500001,maxlg=19;
list<int> node[maxn];
int d[maxn],f[maxn][maxlg+1];
void build(int x)
{
    //cout<<'#'<<x<<endl;
    for(list<int>::iterator i=node[x].begin();i!=node[x].end();i++)
        if(f[*i][0]==0){    d[*i]=d[x]+1;f[*i][0]=x;build(*i);}
}
inline void init(int S,int n)
{
    f[S][0]=-1;build(S);
    for(int j=1;j<=maxlg;j++)
        for(int i=1;i<=n;i++)
            if(f[i][j-1]==-1)    f[i][j]=0;
            else    f[i][j]=f[f[i][j-1]][j-1];
}
inline int query(int a,int b)
{
    if(d[a]>d[b]){    int t=a;a=b;b=t;}
    for(int i=0;i<=maxlg;i++)
        if(d[b]-d[a]>>i&1)    b=f[b][i];
    if(a==b)    return a;
    for(int i=maxlg;i>=0;i--)
        if(f[a][i]!=f[b][i])
            a=f[a][i],b=f[b][i];
    return f[a][0];
}
int main()
{
    ios::sync_with_stdio(false);
    int n,m,S,u,v;
    cin>>n>>m>>S;
    for(int i=0;i<n-1;i++)
    {
        cin>>u>>v;
        node[u].push_back(v),node[v].push_back(u);
    }
    init(S,n);
    //for(int i=1;i<=n;i++)    cout<<'@'<<d[n]<<' '<<f[n][0]<<endl;
    for(int i=0;i<m;i++)
    {
        cin>>u>>v;
        cout<<query(u,v)<<endl;
    }
    return 0;
}

回复

9 条回复,欢迎继续交流。

正在加载回复...