Submission #1249285

#TimeUsernameProblemLanguageResultExecution timeMemory
1249285kunzaZa183Traffic (IOI10_traffic)C++20
50 / 100
1042 ms274304 KiB
#include "traffic.h" #include <bits/stdc++.h> #include <numeric> using namespace std; using ll = long long; int LocateCentre(int N, int pp[], int S[], int D[]) { if (N == 1) return 0; vector<vector<int>> adj(N); for (int i = 0; i < N - 1; i++) { adj[S[i]].push_back(D[i]), adj[D[i]].push_back(S[i]); } vector<ll> stree(N); multiset<ll> msi; vector<int> in(N); vector<pair<int, int>> vpii; vpii.emplace_back(0, 0); while (!vpii.empty()) { A: auto &[cur, par] = vpii.back(); B: if (in[cur] < adj[cur].size()) { if (adj[cur][in[cur]] == par) { in[cur]++; goto B; } vpii.emplace_back(adj[cur][in[cur]++], cur); goto A; } stree[cur] = pp[cur]; for (auto a : adj[cur]) { if (a != par) { stree[cur] += stree[a]; // cout << cur << " " << a << "\n"; msi.insert(stree[a]); } } vpii.pop_back(); } // for (auto a : stree) // cout << a << " "; // cout << "\n"; // for (auto a : msi) // cout << a << " "; // cout << "\n"; ll tot = accumulate(pp, pp + N, 0ll); ll mini = *msi.rbegin(); int ans = 0; function<void(int, int)> fvvi2 = [&](int cur, int par) { if (*msi.rbegin() < mini) { ans = cur; mini = *msi.rbegin(); } for (auto a : adj[cur]) { if (a != par) { msi.erase(msi.find(stree[a])); msi.insert(tot - stree[a]); fvvi2(a, cur); msi.insert(stree[a]); msi.erase(msi.find((tot - stree[a]))); } } }; fvvi2(0, 0); return 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...