Submission #100703

#TimeUsernameProblemLanguageResultExecution timeMemory
100703arman_ferdousRace (IOI11_race)C++17
43 / 100
3099 ms27100 KiB
#include "race.h" #include <bits/stdc++.h> using namespace std; using ll = long long; const int N = 2e5+10; const int MAX = 1e6+10; int n, k; vector< pair<int,int> > g[200010]; int sub[N]; bool Deleted[N]; void dfs(int u, int f) { sub[u] = 1; for(auto it : g[u]) if(it.first != f && !Deleted[it.first]) { dfs(it.first, u); sub[u] += sub[it.first]; } } int get_centroid(int u, int f, int lim) { int ret = -1; for(auto it : g[u]) if(it.first != f && !Deleted[it.first]) { if(sub[it.first] * 2 > lim) { ret = get_centroid(it.first, u, lim); break; } } if(ret == -1) return u; return ret; } int F[MAX]; int get_subtree(int u, int f, int cost, int cnt) { int ret = N + N; if(cost <= k) ret = F[k - cost] + cnt; if(cost == k) ret = min(ret, cnt); for(auto it : g[u]) if(it.first != f && !Deleted[it.first] && cost + it.second <= k) ret = min(ret, get_subtree(it.first, u, cost + it.second, cnt + 1)); return ret; } void upd_subtree(int u, int f, int cost, int cnt) { if(cost < MAX) F[cost] = min(F[cost], cnt); for(auto it : g[u]) if(it.first != f && !Deleted[it.first] && cost + it.second <= k) upd_subtree(it.first, u, cost + it.second, cnt + 1); } int calc(int u) { for(int i = 0; i <= k; i++) F[i] = N+N; int ans = N + N; for(auto it : g[u]) if(!Deleted[it.first]) { ans = min(ans, get_subtree(it.first, u, it.second, 1)); upd_subtree(it.first, u, it.second, 1); } return ans; } int solve(int s) { dfs(s,-1); int u = get_centroid(s, -1, sub[s]); int ret = calc(u); Deleted[u] = true; for(auto it : g[u]) if(!Deleted[it.first]) ret = min(ret, solve(it.first)); return ret; } int best_path(int N_, int K, int H[][2], int L[]) { n = N_; k = K; for(int i = 0; i < n-1; i++) { g[H[i][0]].push_back({H[i][1], L[i]}); g[H[i][1]].push_back({H[i][0], L[i]}); } int ans = solve(0); if(ans >= N+N) return -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...