제출 #675645

#제출 시각아이디문제언어결과실행 시간메모리
675645vjudge1경주 (Race) (IOI11_race)C++17
100 / 100
1016 ms40048 KiB
#define taskname "Race" #include <bits/stdc++.h> #define ll long long #define ii pair<int,int> #define ff first #define ss second using namespace std; const int maxn = 2e5 + 10; vector<ii> adj[maxn]; int sz[maxn], ban[maxn], m, ans = 1e9; map<int,int> mp; void DFSz(int u, int p = 0) { sz[u] = 1; for (auto [v, c]: adj[u]) if (v != p && !ban[v]) DFSz(v, u), sz[u] += sz[v]; } int getcen(int u, int need, int p = -1) { if (sz[u] <= need) return p; ii big = {0, 0}; for (auto [v, c]: adj[u]) if (v != p && !ban[v]) big = max(big, {sz[v], v}); return getcen(big.ss, need, u); } void DFS(int u, int p, int dep, int type, int dis = 1) { if (type == 0) { if (mp.count(m - dep)) ans = min(ans, dis + mp[m-dep]); } else mp[dep] = (mp.count(dep) ? min(mp[dep], dis) : dis); for (auto [v, c]: adj[u]) if (v != p && !ban[v]) DFS(v, u, dep+c, type, dis+1); } void solve(int u = 1) { DFSz(u); u = getcen(u, sz[u]/2); ban[u] = 1; mp.clear(); mp[0] = 0; for (auto [v, c]: adj[u]) if (!ban[v]) DFS(v, u, c, 0), DFS(v, u, c, 1); for (auto [v, c]: adj[u]) if (!ban[v]) solve(v); } int best_path(int N, int K, int H[][2], int L[]) { m = K; for (int i=1; i<=N; i++) adj[i].clear(), ban[i] = 0; for (int i=0; i<N-1; i++) { int u = H[i][0], v = H[i][1], c = L[i]; u++, v++; adj[u].emplace_back(v, c); adj[v].emplace_back(u, c); } solve(); return (ans == 1e9 ? -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...