社区讨论
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 条回复,欢迎继续交流。
正在加载回复...