제출 #786853

#제출 시각아이디문제언어결과실행 시간메모리
786853vjudge1경주 (Race) (IOI11_race)C++17
0 / 100
14 ms27732 KiB
#include "bits/stdc++.h" #include "race.h" using namespace std; #define ii pair<int,int> const int ms = 1e6 + 5; int sz[ms], dis[ms]; int n, sum, ans, k; vector<ii> g[ms]; void put(int u, int p, int d, int qtd=0){ if(d > k) return; dis[d] = min(dis[d], qtd); for(auto [v, w] : g[u]){ if(v == p) continue; put(v, u, d+w, qtd+1); } } void qry(int u, int p, int d, int qtd=0){ if(d > k) return; ans = min(ans, dis[d] + dis[k-d]); for(auto [v, w] : g[u]){ if(v == p) continue; qry(v, u, d+w, qtd+1); } } void clean(int u, int p, int d){ if(d > k) return; dis[d] = n + 100; for(auto [v, w] :g[u]){ if(v == p) continue; clean(v, u, d +w); } } void dfs(int u, int p = -1, bool keep = false){ int big = -1; for(auto [v, w] : g[u]){ if(v == p) continue; if(big == -1 || sz[big] < sz[v]){ big = v; } } for(auto [v, w] : g[u]){ if(v == p || v == big) continue; dfs(v, u, false); } if(big != -1) dfs(big, u, true); for(auto [v, w] : g[u]){ if(v == big || v == p) continue; qry(v, u, w, 1); put(v, u, w, 1); } if(!keep){ clean(u, p, 0); dis[0] = 0; } } int getSz(int u=0, int p=-1){ sz[u] = 1; for(auto [v, w] : g[u]){ if(v == p) continue; sz[u] += getSz(v, u); } return sz[u]; } int best_path(int N, int K, int H[][2], int L[]){ k = K; n = N; 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]}); } memset(dis, 0x3f, sizeof dis); dis[0] = 0; ans = n+ 100; getSz(); dfs(0); if(ans > 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...