Submission #1188841

#TimeUsernameProblemLanguageResultExecution timeMemory
1188841g4yuhgRace (IOI11_race)C++20
100 / 100
1154 ms44944 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define fi first #define se second #define pii pair<ll,ll> const int N = 200005; const int inf = 1e9; ll del[N], d[N], ans, child[N]; vector<pii> adj[N]; map<ll, ll> mp; int n, k; void cnt_child(ll u, ll parent) { child[u] = 1; for (auto v : adj[u]) { if (v.fi == parent || del[v.fi]) continue; cnt_child(v.fi, u); child[u] += child[v.fi]; } } ll centroid(ll u, ll parent, ll n) { for (auto v : adj[u]) { if (v.fi == parent || del[v.fi]) continue; if (child[v.fi] > n / 2) { return centroid(v.fi, u, n); } } return u; } void dfs(ll u, ll parent, ll dep) { if (mp.find(k - d[u]) != mp.end()) { ans = min(ans, dep + mp[k - d[u]]); } if (d[u] == k) ans = min(ans, dep); for (auto v : adj[u]) { if (v.fi == parent || del[v.fi]) continue; d[v.fi] = d[u] + v.se; if (d[v.fi] > k) continue; dfs(v.fi, u, dep + 1); } } void dfs2(ll u, ll parent, ll dep) { if (mp.find(d[u]) == mp.end()) { mp[d[u]] = dep; } else { mp[d[u]] = min(mp[d[u]], dep); } for (auto v : adj[u]) { if (v.fi == parent || del[v.fi]) continue; d[v.fi] = d[u] + v.se; if (d[v.fi] > k) continue; dfs2(v.fi, u, dep + 1); } } void gq(ll x) { mp.clear(); d[x] = 0; for (auto v : adj[x]) { if (del[v.fi]) continue; d[v.fi] = d[x] + v.se; dfs(v.fi, x, 1); dfs2(v.fi, x, 1); } } void solve(ll u) { cnt_child(u, u); ll x = centroid(u, u, child[u]); gq(x); del[x] = 1; for (auto v : adj[x]) { if (del[v.fi]) continue; solve(v.fi); } } int best_path(int N_input, int K_input, int H[][2], int L[]) { n = N_input; k = K_input; // reset global data for (int i = 0; i <= n; i++) { adj[i].clear(); del[i] = d[i] = child[i] = 0; } ans = inf; // build tree for (int i = 0; i < n - 1; i++) { int u = H[i][0] + 1; int v = H[i][1] + 1; int w = L[i]; adj[u].push_back({v, w}); adj[v].push_back({u, w}); } solve(1); if (ans == inf) return -1; 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...