제출 #100454

#제출 시각아이디문제언어결과실행 시간메모리
100454alexpetrescu경주 (Race) (IOI11_race)C++14
100 / 100
2958 ms87800 KiB
#include "race.h" #include <vector> #include <map> #define MAXN 200000 struct myc {int x, y;}; std::map <long long, myc> val; int timp; std::vector < myc > g[MAXN]; int s[MAXN], k, h[MAXN]; int fiuMare[MAXN], t[MAXN]; long long u[MAXN]; int ans, cine; bool tip; void dfs(int x) { s[x] = 1; fiuMare[x] = x; for (auto &y : g[x]) { if (h[y.x] == 0) { h[y.x] = h[x] + 1; u[y.x] = u[x] + y.y; t[y.x] = x; dfs(y.x); s[x] += s[y.x]; if (s[y.x] > s[fiuMare[x]] || fiuMare[x] == x) fiuMare[x] = y.x; } } } inline void vezi(int x) { if (ans == -1 || x < ans) ans = x; } inline void baga(int x) { myc &t = val[u[x]]; if (t.y != timp || t.x > h[x]) t = {h[x], timp}; } void tot(int x) { if (tip) baga(x); else { int e = k + 2 * u[cine] - u[x]; if (e >= 0 && val[e].y == timp) vezi(h[x] - 2 * h[cine] + val[e].x); } for (auto &y : g[x]) if (t[y.x] == x) tot(y.x); } inline void solve(int x) { bool ok = 1; while (ok) { for (auto &y : g[x]) { if (t[y.x] == x && y.x != fiuMare[x]) { cine = x; tip = 0; tot(y.x); tip = 1; tot(y.x); } } baga(x); int e = u[x] + k; if (e >= 0 && val[e].y == timp) vezi(val[e].x - h[x]); if (t[x] != -1 && fiuMare[t[x]] == x) x = t[x]; else ok = 0; } } int best_path(int N, int K, int H[][2], int L[]) { 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]}); for (int i = 0; i < N; i++) h[i] = 0; int rad = 0; h[rad] = 1; u[rad] = 0; t[rad] = -1; dfs(rad); ans = -1; k = K; for (int i = 0; i < N; i++) { if (fiuMare[i] == i) { timp++; solve(i); } } 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...