关注
第二个换根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 评论
相关推荐

点赞 评论 收藏
分享

点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 技术岗笔试题求解 #
77553次浏览 1005人参与
# 拼多多求职进展汇总 #
642282次浏览 4983人参与
# 工作一周年分享 #
30695次浏览 179人参与
# 如果公司给你放一天假,你会怎么度过? #
16231次浏览 122人参与
# 作业帮求职进展汇总 #
55740次浏览 370人参与
# 华子oc时间线 #
1236368次浏览 6473人参与
# OPPO求职进展汇总 #
662142次浏览 5032人参与
# 总结:哪家公司面试体验感最差 #
60451次浏览 273人参与
# 职场上哪些事情令人讨厌 #
18711次浏览 91人参与
# 三一重工求职进展汇总 #
14299次浏览 65人参与
# 去年你投递实习了吗? #
21972次浏览 329人参与
# 这些公司卡简历很严格 #
41275次浏览 204人参与
# 扒一扒那些奇葩实习经历 #
66290次浏览 913人参与
# 经纬恒润求职进展汇总 #
121654次浏览 1032人参与
# 提前批过来人的忠告 #
113838次浏览 1194人参与
# 说说你知道的学历厂 #
58216次浏览 351人参与
# 秋招最大的收获是什么? #
36867次浏览 311人参与
# 找工作时的取与舍 #
80006次浏览 566人参与
# 你认为小厂实习有用吗? #
29218次浏览 341人参与
# 哪一瞬间觉得自己长大了 #
13845次浏览 327人参与