Submission #1176304

#TimeUsernameProblemLanguageResultExecution timeMemory
1176304pera경주 (Race) (IOI11_race)C++20
100 / 100
260 ms34296 KiB
#include<bits/stdc++.h> using namespace std; const int N = 2E5 + 1 , M = 1E6 + 1; vector<int> dead(N) , sz(N) , f(M , -1); vector<pair<int , int>> g[N]; int gsz(int u , int p = 0){ int s = 0; for(auto [v , w] : g[u]){ if(v != p && !dead[v]){ s += gsz(v , u); } } sz[u] = ++s; return sz[u]; } int find(int u , int m , int p = 0){ for(auto [v , w] : g[u]){ if(v != p && !dead[v] && sz[v] > m / 2){ return find(v , m , u); } } return u; } void calc(int u , int p , int D , int L , int K , vector<pair<int , int>> &d){ if(L > K){ return; } d.emplace_back(L , D); ++D; for(auto [v , w] : g[u]){ if(v != p && !dead[v]){ calc(v , u , D , L + w , K , d); } } } int solve(int u , int k){ u = find(u , gsz(u)); int ans = 1E9; f[0] = 0; vector<int> clr; for(auto [v , w] : g[u]){ if(!dead[v]){ vector<pair<int , int>> dists; calc(v , u , 1 , w , k , dists); for(auto [X , Y] : dists){ if(f[k - X] != -1){ ans = min(ans , Y + f[k - X]); } } for(auto [X , Y] : dists){ if(f[X] == -1){ f[X] = Y; }else{ f[X] = min(f[X] , Y); } clr.emplace_back(X); } } } for(int x : clr){ f[x] = -1; } dead[u] = 1; for(auto [v , w] : g[u]){ if(!dead[v]){ ans = min(ans , solve(v , k)); } } return ans; } int best_path(int N, int K, int H[][2], int L[]){ for(int i = 0;i < N - 1;i ++){ for(int w = 0;w < 2;w ++){ ++H[i][w]; } for(int w = 0;w < 2;w ++){ g[H[i][w]].emplace_back(H[i][w ^ 1] , L[i]); } } int A = solve(1 , K); if(A > N){ A = -1; } return A; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...