제출 #388446

#제출 시각아이디문제언어결과실행 시간메모리
388446pure_mem경주 (Race) (IOI11_race)C++14
100 / 100
1115 ms41756 KiB
#include "race.h" #include <bits/stdc++.h> #define X first #define Y second #define MP make_pair #define ll long long using namespace std; const int MAXN = 2e5 + 12; int answer, n, k, sz[MAXN], mx[MAXN]; map< int, int > act; vector< pair< int, int > > graph[MAXN]; bool block[MAXN]; void dfs_sz(int v, int pr){ sz[v] = 1, mx[v] = 0; for(pair<int, int> to: graph[v]){ if(to.X != pr && !block[to.X]){ dfs_sz(to.X, v), sz[v] += sz[to.X]; if(sz[mx[v]] < sz[to.X]) mx[v] = to.X; } } } int get_cent(int v){ int u = v; while(sz[v] < sz[mx[u]] * 2) u = mx[u]; return u; } void dfs_ans(int v, int pr, ll cost, int dist){ if(cost > k) return; if(act.count(k - cost)) answer = min(answer, dist + act[k - cost]); for(pair<int, int> to: graph[v]){ if(to.X != pr && !block[to.X]){ dfs_ans(to.X, v, cost + to.Y, dist + 1); } } } void dfs_add(int v, int pr, ll cost, int dist){ if(cost > k) return; if(!act.count(cost) || act[cost] > dist) act[cost] = dist; for(pair<int, int> to: graph[v]){ if(to.X != pr && !block[to.X]){ dfs_add(to.X, v, cost + to.Y, dist + 1); } } } void cent(int v){ dfs_sz(v, v), v = get_cent(v), block[v] = 1; act[0] = 0; for(pair<int, int> to: graph[v]){ if(!block[to.X]) dfs_ans(to.X, v, to.Y, 1), dfs_add(to.X, v, to.Y, 1); } act.clear(); for(pair<int, int> to: graph[v]){ if(!block[to.X]) cent(to.X); } } int best_path(int N, int K, int H[][2], int L[]){ n = N, k = K, answer = MAXN; for(int i = 0;i < n - 1;i++){ graph[H[i][1] + 1].push_back(MP(H[i][0] + 1, L[i])); graph[H[i][0] + 1].push_back(MP(H[i][1] + 1, L[i])); } cent(1); if(answer == MAXN) answer = -1; return answer; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...