제출 #1213085

#제출 시각아이디문제언어결과실행 시간메모리
1213085arman_ferdous경주 (Race) (IOI11_race)C++20
100 / 100
355 ms31784 KiB
#include "race.h" #include <bits/stdc++.h> using namespace std; const int N = 2e5+10; const int M = 1e6+10; const int oo = 1e9; int n, k, ans, table[M]; vector<vector<pair<int,int>>> g; int sub[N]; bool bad[N]; void dfs_siz (int u, int f) { sub[u] = 1; for (auto [v, w] : g[u]) if (!bad[v] && v ^ f) dfs_siz(v, u), sub[u] += sub[v]; } int fc (int u, int f, int lim) { for (auto [v, w] : g[u]) if (!bad[v] && v ^ f && sub[v] > lim) return fc(v, u, lim); return u; } void dfs (int u, int f, int dist, int edgecnt, int ty) { if (dist > k) return; if (ty == 0) ans = min(ans, table[k - dist] + edgecnt); else if (ty == 1) table[dist] = min(table[dist], edgecnt); else table[dist] = oo; for (auto [v, w] : g[u]) if (!bad[v] && v ^ f) dfs(v, u, dist + w, edgecnt + 1, ty); } void decompose (int u) { dfs_siz(u, 0); u = fc(u, 0, sub[u] >> 1); bad[u] = true; table[0] = 0; for (auto [v, w] : g[u]) if (!bad[v]) { dfs(v, u, w, 1, 0); dfs(v, u, w, 1, 1); } table[0] = oo; for (auto [v, w] : g[u]) if (!bad[v]) dfs(v, u, w, 1, -1); for (auto [v, w] : g[u]) if (!bad[v]) decompose(v); } int best_path(int N, int K, int H[][2], int L[]) { n = N, k = K; g.resize(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]}); } fill(table, table + k + 1, oo); ans = oo; decompose(1); if (ans == oo) 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...