Submission #307516

#TimeUsernameProblemLanguageResultExecution timeMemory
307516tengiz05Race (IOI11_race)C++17
100 / 100
1351 ms36076 KiB
#include "race.h" #include <bits/stdc++.h> using namespace std; const int NN = 2e5 + 5; bool used[NN]; int sz[NN]; int n, k; vector<pair<int, int>> edges[NN]; void dfs_size(int u, int p){ sz[u] = 1; for(auto X : edges[u]){ int v = X.first; if(used[v] || v == p)continue; dfs_size(v, u); sz[u] += sz[v]; } } int centroid(int u, int p, int size){ for(auto X : edges[u]){ int v = X.first; if(used[v] || v == p)continue; if(sz[v] > size/2)return centroid(v, u, size); } return u; } vector<pair<int, int>> m; map<int, int> len; void dfs(int u, int p, int dist, int t){ if(dist > k)return; m.push_back({dist, t}); for(auto X : edges[u]){ int v = X.first; int cost = X.second; if(used[v] || v == p)continue; dfs(v, u, dist+cost, t+1); } } void dfs2(int u, int p, int dist, int t){ if(dist > k)return; if(!len.count(dist))len[dist] = t; else len[dist] = min(len[dist], t); for(auto X : edges[u]){ int v = X.first; int cost = X.second; if(used[v] || v == p)continue; dfs2(v, u, dist+cost, t+1); } } int find_min(int u, int p=-1){ int ans = 1e9; len.clear(); dfs_size(u, u); u = centroid(u, u, sz[u]); len[0] = 0; used[u] = true;//delete centroid for(auto X : edges[u]){ m.clear(); int v = X.first; int cost = X.second; if(used[v])continue; dfs(v, u, cost, 1); for(auto X : m){ int dist = X.first; int time = X.second; if(len.count(k-dist)){ ans = min(ans, len[k-dist]+time); }//cout << dist << ' ' << time << '\n'; } dfs2(v, u, cost, 1); } for(auto X : edges[u]){ int v = X.first; if(used[v] || p == v)continue; ans = min(ans, find_min(v, u)); } return ans; } int best_path(int N, int K, int H[][2], int L[]){ n = N; k = K; for(int i=0;i<n-1;i++){ edges[H[i][0]].push_back({H[i][1],L[i]}); edges[H[i][1]].push_back({H[i][0],L[i]}); } if(k == 0){ return 0; } int ans = find_min(0); // cout << '\n' << ans << '\n'; if(ans == 1e9)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...