Submission #1299408

#TimeUsernameProblemLanguageResultExecution timeMemory
1299408altern23Race (IOI11_race)C++20
100 / 100
646 ms48756 KiB
#include "race.h" #include <bits/stdc++.h> using namespace std; #define ll long long #define pii pair<ll, ll> #define fi first #define sec second const int MAXN = 2e5; const ll INF = 1e18; vector <pii> adj[MAXN + 5]; ll ans = INF, N, K, vis[MAXN + 5], sz[MAXN + 5]; void dfs(ll idx, ll par) { sz[idx] = 1; for (auto [i, j] : adj[idx]) { if (i != par && !vis[i]) { dfs(i, idx); sz[idx] += sz[i]; } } } ll find_centroid(ll idx, ll par, ll cur_sz) { for (auto [i, j] : adj[idx]) { if (i != par && !vis[i]) { if (sz[i] > cur_sz / 2) return find_centroid(i, idx, cur_sz); } } return idx; } vector <ll> v; ll dist[MAXN + 5], dist2[MAXN + 5]; map<ll, ll> mp; void dfs2(ll idx, ll par) { v.push_back(idx); for (auto [i, j] : adj[idx]) { if (i != par && !vis[i]) { dist[i] = dist[idx] + j; dist2[i] = dist2[idx] + 1; dfs2(i, idx); } } } void solve(ll idx) { dfs(idx, -1); ll cen = find_centroid(idx, -1, sz[idx]); vis[cen] = 1; dist[cen] = dist2[cen] = 0; for (auto [i, j] : adj[cen]) { if (!vis[i]) { dist[i] = dist[cen] + j; dist2[i] = dist2[cen] + 1; v.clear(); dfs2(i, cen); for (auto x : v) { if (mp.count(K - dist[x])) { ans = min(ans, dist2[x] + mp[K - dist[x]]); } } for (auto x : v) { if (!mp.count(dist[x])) mp[dist[x]] = dist2[x]; else mp[dist[x]] = min(mp[dist[x]], dist2[x]); } } } if (mp.count(K)) { ans = min(ans, mp[K]); } mp.clear(); for (auto [i, j] : adj[cen]) { if (!vis[i]) solve(i); } } int best_path(int n, int k, int H[][2], int L[]) { N = n, K = k; for (int i = 0; i < N - 1; i++) { adj[H[i][0]].push_back({H[i][1], L[i]}); adj[H[i][1]].push_back({H[i][0], L[i]}); } solve(0); if (ans == INF) ans = -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...