999ms

Task J - 09.03.2019

Mar 9th, 2019
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.26 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef int64_t ll;
  4. ////////////
  5.  
  6. const int sz = 1e6 + 10;
  7. int n;
  8. ll w[sz];
  9. vector<int> g[sz];
  10. ll depth[sz];
  11. bool used[sz];
  12.  
  13. ///////////
  14.  
  15.  
  16. void dfs(int f){
  17.     used[f] = true;
  18.     for(int v : g[f]){
  19.         if(!used[v]){
  20.             dfs(v);
  21.             depth[f] += depth[v];
  22.         }
  23.     }
  24.     depth[f] += w[f];
  25. }
  26.  
  27. vector<pair<ll ,int> > gw[sz];
  28.  
  29. ll dfsAns(int f, int e = 0){
  30.     used[f] = true;
  31.     ll ans = 0;
  32.     int cursz = gw[f].size() - 1;
  33.     for(int  i = 0; i<gw[f].size(); i++){
  34.         if(!used[gw[f][i].second])
  35.         ans += dfsAns(gw[f][i].second, cursz - i);
  36.     }
  37.     ans += depth[f] * e;
  38.     return ans;
  39. }
  40.  
  41. void solve() {
  42.     cin>>n;
  43.     memset(depth, 0, sizeof depth);
  44.     memset(used, 0, sizeof used);
  45.     for(int i=0;i<n;i++){
  46.         int f,t;
  47.         cin>>w[i]>>f;
  48.         if(f!=-1){
  49.             g[f].push_back(i);
  50.             g[i].push_back(f);
  51.         }  
  52.     }
  53.     for(int i=0;i<n;i++){  
  54.         if(!used[i]) dfs(i);
  55.     }
  56.  
  57.     for(int i=0;i<n;i++){
  58.         for(int t : g[i]){
  59.             if(depth[t] < depth[i])
  60.             gw[i].push_back({depth[t],t});
  61.         }
  62.         sort(gw[i].begin(), gw[i].end());
  63.     }
  64.     ll ans = 0;
  65.  
  66.     memset(used, 0, sizeof used);
  67.     for(int i=0;i<n;i++){
  68.         if(!used[i]){
  69.             ans += dfsAns(i);
  70.         }
  71.     }
  72.     cout<<ans;
  73. }
  74.  
  75. int main(){
  76.     ios_base::sync_with_stdio(false);
  77.     cin.tie(nullptr);
  78.     solve();
  79.     return 0;
  80. }
Add Comment
Please, Sign In to add comment