제출 #1228393

#제출 시각아이디문제언어결과실행 시간메모리
1228393countless경주 (Race) (IOI11_race)C++20
9 / 100
3095 ms9796 KiB
#include "race.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; #define sp <<" "<< #define endl "\n" vector<bool> good; vector<ll> sz; vector<vector<pair<ll, ll>>> adj; ll n, k; void subtree(ll u, ll p = -1) { sz[u] = 1; for (auto &[v, ww] : adj[u]) { if (v != p and good[v]) { subtree(v, u); sz[u] += sz[v]; } } } ll centroid(ll targ, ll u, ll p = -1) { for (auto &[v, ww] : adj[u]) { if (v != p and good[v] and 2 * sz[v] > targ) { return centroid(v, u, targ); } } return u; } void process(vector<pair<ll, ll>> &w, ll dist, ll cost, ll u, ll p = -1) { if (dist > k) return; w.push_back({dist, cost}); for (auto &[v, ww] : adj[u]) { if (v != p and good[v]) { process(w, dist + ww, cost + 1, v, u); } } } ll dnc(ll st) { subtree(st); ll siz = sz[st]; ll cen = centroid(siz, st); good[st] = false; unordered_map<ll, vector<pair<ll, ll>>> mp; for (auto &[v, ww] : adj[st]) { if (good[v]) { process(mp[v], ww, 1, v, st); } } ll res = LLONG_MAX; unordered_map<ll, ll> rec; rec[0] = 0; for (auto &[v, ls] : mp) { for (auto &[d, c] : ls) { if (k - d >= 0 and rec.count(k - d)) { res = min(res, rec[k - d] + c); } } for (auto &[d, c] : ls) { if (rec.count(d)) rec[d] = min(rec[d], c); else rec[d] = c; } } for (auto &[v, ww] : adj[st]) { if (good[v]) { res = min(res, dnc(v)); } } return res; } int best_path(int N, int K, int H[][2], int L[]) { n = N, k = K; adj.assign(n, {}); for (int i = 0; i < N - 1; i++) { auto [u, v] = H[i]; ll w = L[i]; adj[u].push_back({v, w}); adj[v].push_back({u, w}); } good.assign(n, true); sz.resize(n); ll ans = dnc(0); return (ans == LLONG_MAX ? -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...