Submission #64956

#TimeUsernameProblemLanguageResultExecution timeMemory
64956PeppaPig경주 (Race) (IOI11_race)C++14
100 / 100
1585 ms119076 KiB
#include "race.h" #include <bits/stdc++.h> using namespace std; #define pii pair<int, int> #define x first #define y second const int N = 2e5+5; int n, k; int dep[N], pos[N], in[N], out[N], sz[N]; long d[N]; vector<pii> g[N]; void get_sz(int u, int p) { static int idx = 0; in[u] = ++idx, pos[idx] = u, sz[u] = 1; if(u) for(auto it = g[u].begin();;++it) if(it->x == p) { g[u].erase(it); break; } for(pii &v : g[u]) { d[v.x] = d[u] + v.y; dep[v.x] = dep[u] + 1; get_sz(v.x, u), sz[u] += sz[v.x]; if(sz[g[u][0].x] < sz[v.x]) swap(v, g[u][0]); } out[u] = idx; } int ans = 1e9; map<long, int> M; void setMap(int u) { if(M[d[u]] == 0) M[d[u]] = dep[u]; else M[d[u]] = min(M[d[u]], dep[u]); } void getVal(int u, int lca) { long val = k - d[u] + 2*d[lca]; int ret = M[val]; if(ret != 0) { int z = ret + dep[u] - 2 * dep[lca]; ans = min(ans, z); } } void solve(int u, bool keep) { for(pii v : g[u]) if(v != g[u][0]) solve(v.x, false); if(g[u].size()) solve(g[u][0].x, true); getVal(u, u), setMap(u); for(pii v : g[u]) if(v != g[u][0]) { for(int i = in[v.x]; i <= out[v.x]; ++i) getVal(pos[i], u); for(int i = in[v.x]; i <= out[v.x]; ++i) setMap(pos[i]); } if(!keep) M.clear(); } int best_path(int N, int K, int H[][2], int L[]) { k= K; for(int i = 0; i < N-1; ++i) { g[H[i][0]].emplace_back(H[i][1], L[i]); g[H[i][1]].emplace_back(H[i][0], L[i]); } dep[0] = 1; get_sz(0, -1); solve(0, false); return (ans == (int)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...