关注
第二个换根dp
A的代码:#include<bits/stdc++.h>
(35927)#define int long long
using namespace std;
const int N = 1e5+5;
struct Node{
int u,v,next;
}a[N];
int n,m;
int tot,last[N];
int ans[N];
int dp[N];
int sum[N];
void add(int u,int v)
{
tot++;
a[tot].u = u;
a[tot].v = v;
a[tot].next = last[u];
last[u] = tot;
}
void dfs(int u,int fa)
{
for(int i = last[u];i >= 0;i = a[i].next)
{
int v = a[i].v;
if(v == fa)
{
continue;
}
dfs(v,u);
sum[u] += sum[v] + 1;
dp[u] += dp[v] + sum[v]+1;
}
}
void dfs2(int u,int fa)
{
for(int i = last[u]; i >= 0; i = a[i].next)
{
int v = a[i].v;
if(v == fa)
{
continue;
}
ans[v] = dp[v] + (ans[u] - (dp[v] + sum[v] + 1 )) + ( n - sum[v] - 1);
dfs2(v,u);
}
}
signed main()
{
tot = -1;
memset(last,-1,sizeof(last));
cin>>n>>m;
for(int i = 2;i <= n; i++)
{
int u,v;
cin>>u;
add(i,u);
add(u,i);
}
memset(dp,0,sizeof(dp));
dfs(1,-1);
ans[1] = dp[1];
dfs2(1,-1);
for(int i = 1;i <= m; i++)
{
int u;
cin>>u;
cout<<ans[u];
if(i == m)
{
cout<<endl;
}
else{
cout<<" ";
}
}
return 0;
}
查看原帖
1 评论
相关推荐
牛客热帖
更多
正在热议
更多
# 刚入职就____,这样正常吗? #
34327次浏览 287人参与
# 哪些公司对双非友好 #
61757次浏览 473人参与
# 小红书校招直播来了 #
50146次浏览 225人参与
# 你是怎么和mt相处的? #
32059次浏览 186人参与
# 面试反问你会问什么 #
41943次浏览 582人参与
# 实习返校后,你的精神状态是__? #
22559次浏览 123人参与
# 你朋友圈最大的人脉是谁? #
15209次浏览 118人参与
# 上班苦还是上学苦呢? #
273571次浏览 1727人参与
# 最难的技术面是哪家公司? #
42266次浏览 699人参与
# 关于求职,我有X不投 #
21868次浏览 150人参与
# 实习必须要去大厂吗? #
126864次浏览 1471人参与
# 秋招遇到的奇葩面试题 #
33356次浏览 181人参与
# 这个工作能去吗 #
14567次浏览 113人参与
# 招银网络求职进展汇总 #
135794次浏览 885人参与
# 机械人,你被简历秒挂的企业有哪些? #
57912次浏览 320人参与
# 找工作前vs找工作后的心路变化 #
19048次浏览 151人参与
# 4399求职进展汇总 #
29141次浏览 153人参与
# kpi面有什么特征 #
73001次浏览 455人参与
# 上班到公司第一件事做什么? #
89578次浏览 657人参与
# 机械人,签完三方你在忙什么? #
58848次浏览 228人参与
# 你觉得机械有必要实习吗 #
61294次浏览 476人参与