Codeforces Round #678 (Div. 2) D. Bandit in a City ###K ###K //K

题目链接:https://codeforces.ml/contest/1436/problem/D

题意:给定一棵以1为根节点的有向树,问选出一条路使得 可以抓到的人最多,每个节点有给定人数,人只能单向走

思路:给定的是一棵树的结构   在没有限制的情况下考虑最优的肯定是 子树中的人数和除以该子树的叶子数

但是有些人是不能往回走的,如果出现这种情况那么说明某棵子树可以有更多的人数,在当前的子树中反而回拉低最大值

所以应该找那一棵更大的子树,所以只需要找出所有的子树求最大值即可

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define pb push_back
 5 const int maxn =2e5+10;
 6 const int mod=998244353;
 7 vector<int>E[maxn];
 8 int a[maxn];
 9 ll ans=0;
10 ll cnt[maxn];
11 ll sum[maxn];
12 
13 
14 void dfs(int u)
15 {
16     sum[u]=a[u];
17     for(auto &v:E[u])
18     {
19         dfs(v);
20         cnt[u]+=cnt[v];
21         sum[u]+=sum[v];
22     }
23     if(!E[u].size())
24         cnt[u]=1;
25     ans=max(ans,(sum[u]+cnt[u]-1)/cnt[u]);
26 }
27 
28 int main()
29 {
30     ios::sync_with_stdio(false);
31     cin.tie(0);
32     int n;
33     cin>>n;
34     for(int i=2;i<=n;i++)
35     {
36         int x;
37         cin>>x;
38         E[x].pb(i);
39     }
40     for(int i=1;i<=n;i++)
41         cin>>a[i];
42     dfs(1);
43     cout<<ans<<'\n';
44 
45 
46 
47 
48 }
View Code

 

posted @ 2020-10-26 21:43  canwinfor  阅读(281)  评论(0)    收藏  举报