제출 #998162

#제출 시각아이디문제언어결과실행 시간메모리
998162The_Samurai경주 (Race) (IOI11_race)C++17
9 / 100
223 ms28448 KiB
#include "bits/stdc++.h" #include "race.h" using namespace std; using ll = long long; const int inf = 1e9, N = 2e5 + 5; int ans = inf, k; vector<vector<pair<int, int>>> g(N); vector<int> par(N, -1), heavy(N), height2(N); vector<ll> height(N), diff(N); vector<set<pair<ll, int>>> st(N); /* height[heavy[u]] - height[v] = k + height[v] - height[u] = k????? height[heavy[u]] - k - height[u] = height[v] */ int dfs(int u) { heavy[u] = u; int size = 1, max_child_size = 0; for (auto [v, w]: g[u]) { if (par[u] == v) continue; height[v] = height[u] + w; height2[v] = height2[u] + 1; par[v] = u; int child_size = dfs(v); if (child_size > max_child_size) { heavy[u] = heavy[v]; max_child_size = child_size; } size += child_size; } diff[u] = height[heavy[u]] - height[u]; return size; } void dfs2(int u) { for (auto [v, w]: g[u]) { if (par[u] == v) continue; dfs2(v); } multiset<pair<ll, int>> shit; for (auto it: st[heavy[u]]) shit.insert(it); // cout << u << ' ' << heavy[u] << endl; for (auto [v, w]: g[u]) { if (par[u] == v or heavy[u] == heavy[v]) continue; for (auto it: st[heavy[v]]) { it.first += height[heavy[u]] - height[heavy[v]]; st[heavy[u]].insert(it); shit.insert(it); } } // if (u == 1) { // for (auto it: shit) { // cout << it.first << ' ' << it.second << endl; // } // } for (auto [v, w]: g[u]) { if (par[u] == v or heavy[u] == heavy[v]) continue; for (auto it: st[heavy[v]]) { it.first += height[heavy[u]] - height[heavy[v]]; shit.erase(shit.find(it)); } for (auto it: st[heavy[v]]) { it.first += height[heavy[u]] - height[heavy[v]]; ll need = k - (height[heavy[u]] - it.first) + height[u]; auto it2 = shit.lower_bound(make_pair(height[heavy[u]] - need, 0)); if (it2 != shit.end() and it2->first == height[heavy[u]] - need) { ans = min(ans, it2->second + it.second - 2 * height2[u]); } } for (auto it: st[heavy[v]]) { it.first += height[heavy[u]] - height[heavy[v]]; shit.insert(it); } st[heavy[v]].clear(); } st[heavy[u]].emplace(diff[u], height2[u]); ll search = height[heavy[u]] - k - height[u]; auto it = st[heavy[u]].lower_bound(make_pair(search, 0)); if (it != st[heavy[u]].end() and it->first == search) { ans = min(ans, it->second - height2[u]); } } 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]].emplace_back(H[i][1], L[i]); g[H[i][1]].emplace_back(H[i][0], L[i]); } // change it dfs(0); dfs2(0); return ans == inf ? -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...