Submission #1194199

#TimeUsernameProblemLanguageResultExecution timeMemory
1194199PlayVoltzRace (IOI11_race)C++20
100 / 100
359 ms50240 KiB
#include "race.h" #include <bits/stdc++.h> using namespace std; #define pii pair<int, int> #define mp make_pair #define pb push_back const int MAXN=2e5+5; int n, k, ans=INT_MAX; set<pii> graph[MAXN]; vector<pii> lazy; int subtree[MAXN], par[MAXN], dist[1000005]; vector<int> revert; int dfs_size(int u, int p){ subtree[u] = 1; for (auto v:graph[u]){ if (v.first==p)continue; subtree[u]+=dfs_size(v.first, u); } return subtree[u]; } int centroidfind(int u, int p, int size){ for (auto v:graph[u]){ if (v.first!=p && subtree[v.first]>size/2)return centroidfind(v.first, u, size); } return u; } void check(int node, int par, int d, int e){ if (d>k)return; ans=min(ans, dist[k-d]+e); lazy.pb(mp(d, e)); for (auto num:graph[node])if (num.first!=par)check(num.first, node, d+num.second, e+1); } void build(int u, int p, int d){ int size = dfs_size(u, p); int centroid = centroidfind(u, p, size); par[centroid] = p; for (auto num:revert)dist[num]=INT_MAX/2; revert.clear(); dist[0]=0; for (auto v:graph[centroid]){ lazy.clear(); check(v.first, centroid, v.second, 1); for (auto num:lazy){ dist[num.first]=min(dist[num.first], num.second); revert.pb(num.first); } } vector<pii> temp; for (auto v:graph[centroid])temp.pb(v); for (auto num:temp){ graph[num.first].erase(mp(centroid, num.second)); graph[centroid].erase(num); build(num.first, centroid, num.second); } } int best_path(int N, int K, int H[][2], int L[]){ n=N, k=K; for (int i=0; i<n-1; ++i){ graph[H[i][0]].insert(mp(H[i][1], L[i])); graph[H[i][1]].insert(mp(H[i][0], L[i])); } for (int i=0; i<=k; ++i)dist[i]=INT_MAX/2; build(0, -1, 0); return (ans>=INT_MAX/2 ? -1: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...