제출 #1053241

#제출 시각아이디문제언어결과실행 시간메모리
1053241vincentbucourt1경주 (Race) (IOI11_race)C++14
43 / 100
181 ms74836 KiB
#include "race.h" #include <bits/stdc++.h> using namespace std; #define ll long long #define f first #define s second const static int INF = 1e9; const int MAXN = 200001; static int N, sumNeed; static vector<pair<int, int>> adj[MAXN]; static int depth[MAXN], sum[MAXN]; static map<int, int> maps[MAXN]; static int ans = INF; void dfs (int node = 0, int parent = -1) { maps[node][sum[node]] = depth[node]; for (pair<int, int> nxt : adj[node]) { int nodenxt = nxt.f, weightnxt = nxt.s; if (nodenxt == parent) continue; depth[nodenxt] = depth[node] + 1; sum[nodenxt] = sum[node] + weightnxt; dfs(nodenxt, node); if (maps[nodenxt].size() > maps[node].size()) swap(maps[nodenxt], maps[node]); for (pair<ll, ll> elem : maps[nodenxt]) { int sumOn = elem.f, depthOn = elem.s; int need = -sumOn + 2*sum[node] + sumNeed; if (maps[node].find(need) != maps[node].end()) { ans = min(ans, maps[node][need] - 2*depth[node] + depthOn); } if (maps[node].find(sumOn) == maps[node].end()) { maps[node][sumOn] = depthOn; } else { maps[node][sumOn] = min(maps[node][sumOn], depthOn); } } maps[nodenxt].clear(); } } int best_path(int N, int K, int H[][2], int L[]) { ::N = N; sumNeed = K; for (int i = 0; i < N-1; i++) { adj[H[i][0]].push_back({H[i][1], L[i]}); adj[H[i][1]].push_back({H[i][0], L[i]}); } dfs(); if (ans == INF) return -1; else 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...