제출 #1275800

#제출 시각아이디문제언어결과실행 시간메모리
1275800nanaseyuzuki경주 (Race) (IOI11_race)C++20
100 / 100
1324 ms75292 KiB
#include <bits/stdc++.h> // Author: Kazuki_Will_Win_VOI_8703 #define fi first #define se second #define pii pair<int, int> using namespace std; const int mn = 1e6 + 5, bm = (1 << 20) + 1; const int inf = 1e9; int n, k, cnt = 0; vector <pii> a[mn]; int st[mn], ft[mn], sz[mn], euler[mn], heavy[mn], d[mn], h[mn]; map <int, int> ans; void txl(int u, int p){ st[u] = ++cnt; euler[cnt] = u; sz[u] = 1; int max_val = 0, heavy_child = 0; for(auto i : a[u]){ int v = i.fi, w = i.se; if(v == p) continue; d[v] = d[u] + 1; h[v] = h[u] + w; txl(v, u); sz[u] += sz[v]; if(sz[v] > max_val){ max_val = sz[v]; heavy_child = v; } } heavy[u] = heavy_child; ft[u] = cnt; } int res = inf; void dfs(int u, int p, bool keep){ if(h[u] == k) res = min(res, d[u]); for(auto i : a[u]){ int v = i.fi, w = i.se; if(v != p && v != heavy[u]) dfs(v, u, false); } if(heavy[u]) dfs(heavy[u], u, true); if(ans[h[u] + k] == 0) ans[h[u] + k] = inf; res = min(res, ans[h[u] + k] - d[u]); if(ans[h[u]] == 0) ans[h[u]] = inf; ans[h[u]] = min(ans[h[u]], d[u]); for(auto i : a[u]){ int v = i.fi, w = i.se; if(v != p && v != heavy[u]){ for(int i = st[v]; i <= ft[v]; i++){ int depth = h[euler[i]]; int left = 2 * h[u] + k - depth; if(ans[left] == 0) ans[left] = inf; res = min(res, d[euler[i]] + ans[left] - 2 * d[u]); } for(int i = st[v]; i <= ft[v]; i++){ if(ans[h[euler[i]]] == 0) ans[h[euler[i]]] = inf; ans[h[euler[i]]] = min(ans[h[euler[i]]], d[euler[i]]); } } } if(!keep){ for(int i = st[u]; i <= ft[u]; i++) ans[h[euler[i]]] = inf; } } int best_path(int N, int K, int H[][2], int L[]){ n = N, k = K; for(int i = 0; i <= n - 2; i++){ int u = H[i][0], v = H[i][1], w = L[i]; ++u, ++v; a[u].push_back({v, w}); a[v].push_back({u, w}); } txl(1, 0); dfs(1, 0, true); if (res > n - 1) res = -1; return res; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...