Submission #379296

#TimeUsernameProblemLanguageResultExecution timeMemory
379296justiny7Race (IOI11_race)C++17
100 / 100
1118 ms38880 KiB
//#include "race.h" #include <bits/stdc++.h> using namespace std; const int mxN=2e5+1, INF=1e9; int k, ans=INF, sz[mxN]; vector<pair<int, int>> adj[mxN], vals; map<int, int> mn; bool vis[mxN]; int dfs_sz(int v, int p=-1) { sz[v]=1; for (auto [u, d]:adj[v]) if (!vis[u] && u^p) sz[v]+=dfs_sz(u, v); return sz[v]; } int dfs_centroid(int tot, int v, int p=-1) { for (auto [u, d]:adj[v]) if (!vis[u] && u^p && sz[u]*2>tot) return dfs_centroid(tot, u, v); return v; } void dfs(int v, int len, int p=-1, int dep=1) { vals.emplace_back(dep, len); for (auto [u, d]:adj[v]) if (!vis[u] && u^p && len+d<=k) dfs(u, len+d, v, dep+1); } void decomp(int x=0) { int v=dfs_centroid(dfs_sz(x), x); vis[v]=1; mn.clear(); mn[0]=0; for (auto [u, d]:adj[v]) { if (vis[u]) continue; vals.clear(); dfs(u, d); for (auto [dep, len]:vals) if (mn.count(k-len)) ans=min(ans, dep+mn[k-len]); for (auto [dep, len]:vals) { if (mn.count(len)) mn[len]=min(mn[len], dep); else mn[len]=dep; } } for (auto [u, d]:adj[v]) if (!vis[u]) decomp(u); } int best_path(int N, int K, int H[][2], int L[]) { k=K; for (int i=0; i<N; ++i) adj[i].clear(); for (int i=0; i<N-1; ++i) { adj[H[i][0]].emplace_back(H[i][1], L[i]); adj[H[i][1]].emplace_back(H[i][0], L[i]); } decomp(); return (ans==INF?-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...