제출 #1248925

#제출 시각아이디문제언어결과실행 시간메모리
1248925Ghulam_Junaid경주 (Race) (IOI11_race)C++20
100 / 100
303 ms93436 KiB
#include <bits/stdc++.h> #include "race.h" using namespace std; typedef long long ll; const ll N = 2e5 + 10; ll n, k, val[N], h[N], ans; vector<pair<ll, ll>> g[N]; map<ll, ll> mp[N]; void dfs(ll v, ll p = -1){ ll mxc = -1; for (auto [w, u] : g[v]){ if (u == p) continue; val[u] = val[v] + w; h[u] = h[v] + 1; dfs(u, v); if (mxc == -1 or mp[mxc].size() < mp[u].size()) mxc = u; } if (mxc != -1) swap(mp[mxc], mp[v]); if (mp[v].find(k + val[v]) != mp[v].end()){ // cerr << "Found1" << endl; ans = min(ans, mp[v][k + val[v]] - h[v]); } for (auto [w, u] : g[v]){ if (u == p or u == mxc) continue; for (auto [sm, hei] : mp[u]){ if (sm - val[v] == k){ ans = min(ans, hei - h[v]); // cerr << "Found2" << endl; } if (mp[v].find(k - sm + 2 * val[v]) != mp[v].end()){ ans = min(ans, mp[v][k - sm + 2 * val[v]] + hei - 2 * h[v]); // cout << sm << " " << hei << " " << k - sm + 2 * val[v] << endl; } } for (auto [sm, hei] : mp[u]){ if (mp[v].find(sm) != mp[v].end()) mp[v][sm] = min(mp[v][sm], hei); else mp[v][sm] = hei; } } mp[v][val[v]] = h[v]; } int best_path(int nn, int kk, int H[][2], int L[]){ n = nn, k = kk; for (int i = 0; i < n - 1; i ++){ int u = H[i][0], v = H[i][1], w = L[i]; g[u].push_back({w, v}); g[v].push_back({w, u}); } ans = n + 1; dfs(0); if (ans > n) ans = -1; return 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...