Submission #936082

#TimeUsernameProblemLanguageResultExecution timeMemory
936082Yell0Race (IOI11_race)C++17
100 / 100
1266 ms60628 KiB
#include <bits/stdc++.h> using namespace std; typedef pair<int,int> pii; typedef long long ll; const int MN=2e5+2; int N,K,stsz[MN],ans=INT_MAX; set<pii> adj[MN],minlen; void find_stsz(int u, int p) { stsz[u] = 1; for(auto [v, l] : adj[u]) { if(v == p) continue; find_stsz(v, u); stsz[u] += stsz[v]; } } int find_centroid(int u, int p, int root) { for(auto [v, l] : adj[u]) { if(v == p) continue; if(stsz[v] > stsz[root]/2) return find_centroid(v, u, root); } return u; } void dfs_upd(int u, int p, int dist, int dep) { if(dist > K) return; auto it = minlen.lower_bound(pii(dist,0)); if(it == minlen.end() || (*it).first != dist) minlen.insert(pii(dist,dep)); else if((*it).second > dep) { minlen.erase(it); minlen.insert(pii(dist,dep)); } for(auto [v, l] : adj[u]) { if(v == p) continue; dfs_upd(v, u, dist+l, dep+1); } } void dfs_search(int u, int p, int dist, int dep) { if(dist > K) return; auto it = minlen.lower_bound(pii(K-dist,0)); if(it != minlen.end() && (*it).first == K-dist) ans = min(ans, (*it).second+dep); for(auto [v, l] : adj[u]) { if(v == p) continue; dfs_search(v, u, dist+l, dep+1); } } 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]].insert(pii(H[i][1], L[i])); adj[H[i][1]].insert(pii(H[i][0], L[i])); } queue<int> q; q.push(0); while(!q.empty()) { int u = q.front(); q.pop(); minlen.clear(); minlen.insert(pii(0,0)); find_stsz(u, -1); int cen = find_centroid(u, -1, u); for(auto [v, l] : adj[cen]) { dfs_search(v, cen, l, 1); dfs_upd(v, cen, l, 1); adj[v].erase(pii(cen, l)); q.push(v); } } return (ans==INT_MAX?-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...