Submission #1297398

#TimeUsernameProblemLanguageResultExecution timeMemory
1297398baotoan655Race (IOI11_race)C++20
100 / 100
710 ms44392 KiB
#include <bits/stdc++.h> #define file(name) if (fopen(name".inp", "r")) { freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); } using namespace std; int best_path(int n, int k, int h[][2], int l[]) { vector<vector<pair<int, int>>> g(n); for(int i = 0; i < n - 1; ++i) { int u = h[i][0], v = h[i][1]; g[u].emplace_back(v, l[i]); g[v].emplace_back(u, l[i]); } int ans = n; vector<bool> del(n, false); vector<int> sz(n, 0); function<void(int, int)> get_sz = [&](int u, int p) -> void { sz[u] = 1; for(pair<int, int> e : g[u]) { int v = e.first; if(v == p || del[v]) continue; get_sz(v, u); sz[u] += sz[v]; } }; function<int(int, int, int)> get_cen = [&](int u, int p, int tot) -> int { for(pair<int, int> e : g[u]) { int v = e.first; if(v == p || del[v]) continue; if(sz[v] > tot / 2) return get_cen(v, u, tot); } return u; }; map<long long, int> mp; function<void(int, int, int, long long, bool)> dfs = [&](int u, int p, int depth, long long dist, bool sus) { if(!sus) { if(mp.count(k - dist)) ans = min(ans, depth + mp[k - dist]); } else { if(mp.count(dist)) mp[dist] = min(mp[dist], depth); else mp[dist] = depth; } for(pair<int, int> e : g[u]) { int v = e.first, w = e.second; if(v == p || del[v]) continue; dfs(v, u, depth + 1, dist + w, sus); } }; function<void(int)> centroid = [&](int u) -> void { get_sz(u, -1); int cen = get_cen(u, -1, sz[u]); del[cen] = true; mp.clear(); mp[0] = 0; for(pair<int, int> e : g[cen]) { int v = e.first, w = e.second; if(del[v]) continue; dfs(v, cen, 1, w, false); dfs(v, cen, 1, w, true); } for(pair<int, int> e : g[cen]) { int v = e.first; if(del[v]) continue; centroid(v); } }; centroid(1); if(ans >= n) ans = -1; return ans; } //int main() { // ios_base::sync_with_stdio(false); // cin.tie(0), cout.tie(0); // // file("A") else file("task"); // int n, k; // cin >> n >> k; // int h[n - 1][2], l[n - 1]; // for(int i = 0; i < n; ++i) { // int u, v, c; // cin >> u >> v >> c; // h[i][0] = u; // h[i][1] = v; // l[i] = c; // } // cout << best_path(n, k, h, l) << '\n'; // return 0; //}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...