关注
第二个换根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 评论
相关推荐
牛客热帖
更多
正在热议
更多
# 腾讯音乐求职进展汇总 #
60225次浏览 348人参与
# 0offer互助地 #
294401次浏览 2383人参与
# 牛友故事会 #
334913次浏览 8808人参与
# 投递几十家公司,到现在0offer,大家都一样吗 #
172710次浏览 1216人参与
# 双非本科的出路是什么? #
108739次浏览 1051人参与
# 工作中,努力重要还是选择重要? #
85960次浏览 1155人参与
# lastday知无不言 #
41921次浏览 394人参与
# 总结:offer选择,我是怎么选的 #
99530次浏览 678人参与
# 小米硬件提前批进度交流 #
160314次浏览 1498人参与
# 秋招被确诊为…… #
150117次浏览 691人参与
# 今年秋招哪家公司给的薪资最良心? #
188165次浏览 1098人参与
# 作业帮求职进展汇总 #
36521次浏览 228人参与
# 学历or实习经历,哪个更重要 #
78770次浏览 618人参与
# 生化医药面经大本营 #
89706次浏览 448人参与
# 追觅科技求职进展汇总 #
11449次浏览 80人参与
# 22届毕业,是读研还是拿外包offer先苟着 #
6446次浏览 31人参与
# 你的秋招第一面感觉怎么样 #
62197次浏览 509人参与
# 选择和努力,哪个更重要? #
59322次浏览 601人参与
# 选了这个offer,你有没有后悔? #
495952次浏览 3537人参与
# 远程面试的尴尬瞬间 #
72053次浏览 627人参与