社区讨论

T了七个点 求条

P5002专心OI - 找祖先参与者 2已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mhizti1u
此快照首次捕获于
2025/11/03 18:24
4 个月前
此快照最后确认于
2025/11/03 18:24
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 5e4 + 50;
int n,r,m;
int p[N];
int dep[N],f[30][N],cnt[N];
vector<int> g[N];

void dfs(int u,int fa){
    dep[u] = dep[fa] + 1;
    for(auto v : g[u]){
        if(v == fa) continue;
        f[0][v] = u;
        dfs(v,u);
    }
}
int lca(int u,int v){
    if(dep[u] < dep[v]) swap(u,v);
    for(int i = 20;i >= 0;i--){
        if(dep[f[i][u]] >= dep[v]){
            u = f[i][u];
        }
    }
    if(u == v) return u;
    for(int i = 20;i >= 0;i--){
        if(f[i][u] == f[i][v]) continue;
        u = f[i][u];
        v = f[i][v];
    }
    return f[0][u];
}

signed main(){
    cin>>n>>r>>m;
    for(int i = 1;i < n;i++){
        int a,b;
        cin>>a>>b;
        g[a].push_back(b);
        g[b].push_back(a);
    }
    dfs(r,0);
    for(int i = 1;i <= 20;i++){
        for(int j = 1;j <= n;j++){
            f[i][j] = f[i - 1][f[i - 1][j]];
        }
    }
    for(int i = 1;i <= n;i++){
        for(int j = i + 1;j <= n;j++){
            cnt[lca(i,j)]++;
        }
    }
    for(int i = 1;i <= m;i++){
        cin>>p[i];
        cout<<cnt[p[i]] * 2 + 1<<endl;
    }
    
    return 0;
}

回复

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

正在加载回复...