关注
第二个换根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 评论
相关推荐
点赞 评论 收藏
分享

点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 我和mentor的爱恨情仇 #
12401次浏览 139人参与
# 面试等了一周没回复,还有戏吗 #
111210次浏览 1022人参与
# 平安产险科技中心求职汇总 #
246729次浏览 2626人参与
# 硬件人,你被哪些公司给挂了 #
45473次浏览 709人参与
# 五一之后,实习真的很难找吗? #
32830次浏览 165人参与
# 考研可以缓解求职焦虑吗 #
16485次浏览 214人参与
# 研究所笔面经互助 #
64411次浏览 424人参与
# 你喜欢工作还是上学 #
34775次浏览 363人参与
# 秋招盘点:机械人值得去的企业 #
66952次浏览 659人参与
# 考研失败就一定是坏事吗? #
96806次浏览 815人参与
# 大学生该如何认清当下的就业环境? #
32409次浏览 283人参与
# 你怎么评价今年的春招? #
93831次浏览 1190人参与
# 考研人,我有话说 #
99652次浏览 916人参与
# 浅聊一下我实习的辛苦费 #
214226次浏览 1662人参与
# 我的AI电子员工 #
6346次浏览 53人参与
# 格力求职进展汇总 #
170011次浏览 1228人参与
# 总结:哪家公司面试体验感最好 #
44263次浏览 321人参与
# 找不到好工作选择GAP真的丢人吗 #
57077次浏览 701人参与
# 如果能重来,就业or读研你选哪个? #
132583次浏览 1662人参与
# 实习好累,可以辞职全力准备秋招吗 #
141789次浏览 1526人参与
# 运营人的第一份offer应该如何选 #
137208次浏览 1069人参与