Submission #939779

#TimeUsernameProblemLanguageResultExecution timeMemory
939779duckindogRace (IOI11_race)C++17
0 / 100
2 ms9560 KiB
#include<bits/stdc++.h> #include "race.h" using namespace std; const int N = 2e5 + 10; int total_sz, wei, answer; bool marked[N]; int sz[N]; vector<pair<int, int>> ad[N]; void dfs1(int u, int p) { sz[u] = 1; total_sz += 1; for (const auto& [v, w] : ad[u]) { if (marked[v] || v == p) continue; dfs1(v, u); sz[u] += sz[v]; } } int dfs2(int u, int p) { for (const auto& [v, w] : ad[u]) { if (marked[v] || v == p) continue; if (sz[v] > total_sz / 2) return dfs2(v, u); } return u; } int f[N]; vector<int> undo; vector<pair<int, int>> lst; void dfs3(int u, int p, int d, int tw) { lst.push_back({d, tw}); undo.push_back(d); for (const auto& [v, w] : ad[u]) { if (v == p || marked[v]) continue; dfs3(v, u, d + 1, tw + w); } } void dfs4(int u) { total_sz = 0; dfs1(u, -1); marked[u = dfs2(u, -1)] = true; f[0] = 0; for (const auto& [v, w] : ad[u]) { dfs3(v, u, 1, w); for (const auto& [d, tw] : lst) { if (tw > wei) continue; answer = min(answer, d + f[wei - tw]); } for (const auto& [d, tw] : lst) { if (tw > wei) continue; f[d] = min(f[d], tw); } lst.clear(); } for (const auto& i : undo) f[i] = 1e7; undo.clear(); for (const auto& [v, w] : ad[u]) { if (marked[v]) continue; dfs4(v); } } int best_path(int n, int k, int h[][2], int l[]) { for (int i = 0; i < n - 1; ++i) { int u = h[i][0], v = h[i][1], w = l[i]; ad[u].push_back({v, w}); ad[v].push_back({u, w}); } answer = 1e7; wei = k; memset(f, 40, sizeof f); dfs4(0); return answer > n ? -1 : answer; } #ifdef LOCAL #define MAX_AA 500000 static int AA, K; static int H[MAX_AA][2]; static int L[MAX_AA]; static int solution; #define int long long mt19937_64 rng(8384815663); int rnd(int l, int r) { return l + rng() % (r - l + 1); } inline void my_assert(int e) {if (!e) abort();} void read_input() { freopen("input.txt", "r", stdin); // AA = rnd(2e5, 2e5), K = rnd(100, 100); cin >> AA >> K; for (int i = 0; i < AA - 1; ++i) { // H[i][0] = rnd(i, i); // H[i][1] = i + 1; // L[i] = rnd(1, 100); cin >> H[i][0] >> H[i][1]; cin >> L[i]; } solution = -1; // cin >> solution; } int32_t main() { int ans; read_input(); ans = best_path(AA,K,H,L); cout << ans << "\n"; return 0; } #endif
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...