Submission #1231492

#TimeUsernameProblemLanguageResultExecution timeMemory
1231492zut3Race (IOI11_race)C++20
100 / 100
343 ms81284 KiB
#include "race.h" #include<bits/stdc++.h> using namespace std; int n, k; vector<vector<pair<int, int>>> g; vector<map<int, int>> d; vector<int> dist, sum; int mn = 2e9; bool have_ans = false; void dfs(int v, int prev) { for(auto [u, w]: g[v]) { if(u == prev) continue; dist[u] = dist[v]+1; sum[u] = sum[v]+w; d[u][sum[u]] = dist[u]; dfs(u, v); } } void mrg(int v, int prev) { int target = k + 2*sum[v]; for(auto [u, w]: g[v]) { if(prev == u) continue; mrg(u, v); if(d[u].size() > d[v].size()) swap(d[u], d[v]); for(auto [key, val]: d[u]) { if(d[v].count(target-key)) { mn = min(mn, d[v][target-key] + val - 2*dist[v]); } } for(auto [key, val]: d[u]) { if(d[v].count(key)) d[v][key] = min(d[v][key], val); else d[v][key] = val; } } } int best_path(int N, int K, int H[][2], int L[]) { n = N; k = K; g.assign(n, vector<pair<int, int>>()); d.assign(n, map<int, int>()); dist.assign(n, 0); sum.assign(n, 0); 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]}); } d[0][0] = 0; dfs(0, -1); mrg(0, -1); if(mn < 1e9) return mn; return -1; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...