Submission #873803

#TimeUsernameProblemLanguageResultExecution timeMemory
873803AlesL0Race (IOI11_race)C++17
9 / 100
89 ms18280 KiB
#include "race.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; const ll maxn = 2e5+4; vector <bool> vis; vector <map <ll, ll>> f; vector <ll> dep_points, dep_len; ll sol = maxn; void dfs_dep(ll c, vector <pair<ll, ll>> g[]){ vis[c] = 1; for (auto x : g[c]){ if (vis[x.first])continue; dep_points[x.first] = dep_points[c]+1; dep_len[x.first] = dep_len[c]+x.second; dfs_dep(x.first, g); } vis[c] = 0; } void compare_merge(map <ll, ll> &x, map <ll, ll> &y, ll add, ll c, ll k){ if (x.size() > y.size())swap(x, y); for (auto it = x.begin(); it != x.end(); it++){ if (k+add-(it->first) < 0)break; if (!y.count(k+add-(it->first)))continue; ll v = (it->first); sol = min(sol, x[v]+y[k+add-v]-dep_points[c]); } for (auto it = x.begin(); it != x.end(); it++){ if (!y.count(it->first))y[it->first] = (it->second); else y[it->first] = min(y[it->first], it->second); } x.clear(); } void dfs_solve(ll c, vector <pair<ll, ll>> g[], ll k){ vis[c] = 1; for (auto x : g[c]){ if (vis[x.first])continue; dfs_solve(x.first, g, k); compare_merge(f[x.first], f[c], 2*dep_len[c], c, k); } f[c][dep_len[c]] = dep_points[c]; if (f[c].count(k+dep_len[c]))sol = min(sol, f[c][k+dep_len[c]]-dep_points[c]); } int best_path(int N, int K, int H[][2], int L[]){ ll n = N, k = K; vector <pair<ll, ll>> g[n]; vis.resize(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]}); } f.resize(n); dep_len.resize(n, 0); dep_points.resize(n, 0); dfs_dep(0, g); dfs_solve(0, g, k); if (sol == maxn)return -1; else return sol; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...