Submission #339613

#TimeUsernameProblemLanguageResultExecution timeMemory
339613TheYellowFlashTraffic (IOI10_traffic)C++17
100 / 100
1283 ms192604 KiB
#include "traffic.h"
#include <bits/stdc++.h>
using namespace std;

#define ll int64_t
#define all(x) x.begin(), x.end()

int LocateCentre(int N, int pp[], int S[], int D[]) {

     vector<vector<int>> adj(N);
     vector<ll> ans(N);
     vector<ll> subtree(N, 0);
     ll sum = 0;

     for(int i = 0; i < N-1; ++i){
          adj[S[i]].push_back(D[i]);
          adj[D[i]].push_back(S[i]);
     }

     for(int i = 0; i < N; ++i){
          subtree[i] += pp[i];
          sum += pp[i];
     }
     
     auto dfs = [&](auto self, int edge, int prev) -> void{
          for(auto& e : adj[edge]){
               if(e == prev) continue;

               self(self, e, edge);
               subtree[edge] += subtree[e];
               ans[edge] = max(ans[edge], subtree[e]);
          }
          ans[edge] = max(ans[edge], sum - subtree[edge]);
     };

     dfs(dfs, 0, 0);
     return min_element(all(ans)) - ans.begin();
}

// subtree[i] originally == node weight
// Increment it each time by weights of its subnodes
// Answer could be max(ans, sum(of all weights) - ans) 
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...