Submission #848322

#TimeUsernameProblemLanguageResultExecution timeMemory
848322victor_gaoRace (IOI11_race)C++17
100 / 100
324 ms66136 KiB
#include "race.h" #include <bits/stdc++.h> #define pii pair<int, int> #define x first #define y second #define MAXN 200015 #define MAXC 1000005 using namespace std; int sz[MAXN], dep[MAXN], mx[MAXN], use[MAXN]; int ans = 2e9, t = 0, k, in[MAXN], out[MAXN], tag = 0; vector<pii> g[MAXN]; vector<int> path; multiset<pii> st; void dfs(int p, int lp) { sz[p] = 1; mx[p] = -1; path.push_back(p); in[p] = t++; for (auto [i, c] : g[p]) { if (i != lp) { dep[i] = dep[p] + c; use[i] = use[p] + 1; dfs(i, p); sz[p] += sz[i]; mx[p] = (mx[p] == -1 || sz[mx[p]] < sz[i]) ? i : mx[p]; } } out[p] = t; } int query(int p, int i) { if (st.empty()) return 2e9; int need = k + 2 * dep[p] - dep[i]; auto it = st.lower_bound(pii(need, -1)); if (it != st.end() && (it->x) == need) return it->y; return 2e9; } void dfs1(int p, int lp, bool flag) { for (auto [i, c] : g[p]) { if (i != lp && i != mx[p]) dfs1(i, p, 0); } if (mx[p] >= 0) dfs1(mx[p], p, 1); for (auto [i, c] : g[p]) { if (i != lp && i != mx[p]) { for (int j = in[i]; j < out[i]; j++) { int a = path[j]; ans = min(ans, use[a] + query(p, a) - 2 * use[p]); } for (int j = in[i]; j < out[i]; j++) { int a = path[j]; st.insert(pii(dep[a], use[a])); } } } ans = min(ans, use[p] + query(p, p) - 2 * use[p]); st.insert(pii(dep[p], use[p])); if (!flag) { for (int i = in[p]; i < out[p]; i++) { int a = path[i]; st.erase(st.find(pii(dep[a], use[a]))); } } } int best_path(int N, int K, int H[][2], int L[]) { 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]}); } dfs(0, 0); dfs1(0, 0, 1); return ans > N ? -1 : 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...