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 }

浙公网安备 33010602011771号