Submission #837917

#TimeUsernameProblemLanguageResultExecution timeMemory
837917thimote75Traffic (IOI10_traffic)C++14
100 / 100
847 ms159104 KiB
#include "traffic.h"

#include <bits/stdc++.h>

using namespace std;

using idata = vector<int>;
using igrid = vector<idata>;

idata weight;
idata subtree_weight;
idata parents;

igrid roads;

int dfs (int node, int parent) {
   parents[node] = parent;

   subtree_weight[node] = weight[node];

   for (int next : roads[node]) if (next != parent)
      subtree_weight[node] += dfs(next, node);

   return subtree_weight[node];
}
int count (int source, int target) {
   if (parents[source] == target)
      return subtree_weight[0] - subtree_weight[source];
   return subtree_weight[target];
}
int find (int source) {
   int res = 0;
   for (int u : roads[source])
      res = max(res, count(source, u));
   
   return res;
}

int LocateCentre(int N, int pp[], int S[], int D[]) {
   weight.resize(N);
   for (int i = 0; i < N; i ++) weight[i] = pp[i];

   roads.resize(N);
   parents.resize(N);
   subtree_weight.resize(N);

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

   dfs(0, -1);

   pair<int, int> H = { 2e9 + 10, 0 };

   for (int i = 0; i < N; i ++) {
      pair<int, int> local = { find(i), i };
      H = min(H, local);
   }

   return H.second;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...