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

点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 26届的你们有几段实习? #
16089次浏览 241人参与
# 你小时候最想从事什么职业 #
102447次浏览 1771人参与
# 你被哪些公司秒挂过? #
16925次浏览 172人参与
# 网申一定要掌握的小技巧 #
9455次浏览 65人参与
# 如何提高实习转正率? #
7109次浏览 132人参与
# 新凯来求职进展汇总 #
40905次浏览 108人参与
# 你认为哪些项目算烂大街? #
7420次浏览 179人参与
# 机械校招之路总结 #
92228次浏览 1889人参与
# 你后悔自己读研吗? #
7934次浏览 168人参与
# 你以为的实习VS真实的实习 #
9956次浏览 121人参与
# 腾讯工作体验 #
479667次浏览 3498人参与
# 月薪多少能在一线城市生存 #
9265次浏览 159人参与
# 最难的技术面是哪家公司? #
5418次浏览 55人参与
# 找工作时的取与舍 #
81144次浏览 577人参与
# 秋招拿一个offer可以躺平吗 #
144625次浏览 928人参与
# 安利/避雷我的专业 #
77504次浏览 526人参与
# 面试等了一周没回复,还有戏吗 #
137034次浏览 1229人参与
# 你想留在一线还是回老家? #
49834次浏览 513人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
114596次浏览 796人参与
# 选择和努力,哪个更重要? #
85900次浏览 745人参与