Submission #1064646

#TimeUsernameProblemLanguageResultExecution timeMemory
1064646Hugo1729Race (IOI11_race)C++17
9 / 100
363 ms42164 KiB
#include <bits/stdc++.h> #include "race.h" using namespace std; typedef long long ll; vector<pair<int,ll>> adj[200001]; int sz[200001]; bool marked[200001]={0}; int k; int dfs_sizes(int v, int pV){ sz[v]=0; for(auto [w,d] : adj[v]){ if(w!=pV&&!marked[w]){ sz[v]+=dfs_sizes(w,v); } } return sz[v]; } int dfs_centroid(int v, int pV, int subtree_sz){ for(auto [w,d] : adj[v]){ if(pV!=v&&!marked[v]&&sz[v]>=(subtree_sz/2)){ return dfs_centroid(w,v,subtree_sz); } } return v; } void dfs_paths(int v, int pV,int dist,int l, vector<pair<ll,int>> &a){ for(auto [w,d] : adj[v]){ if(w!=pV&&!marked[w]){ if(dist+d<=1000000){ a.push_back({dist+d,l+1}); dfs_paths(w,v,dist+d,l+1,a); } } } } int centroid_decomposition(int v){ int c = dfs_centroid(v,v,dfs_sizes(v,v)); marked[c]=1; int ans=1000001; map<ll,int> m; m[0]=0; for(auto [w,d] : adj[c]){ if(!marked[w]){ vector<pair<ll,int>> a; dfs_paths(w,c,d,1,a); for(auto [dist,l] : a){ if(m.count(k-dist)){ ans=min(ans,l+m[k-dist]); } } for(auto [dist,l] : a){ if(m.count(dist))m[dist]=min(m[dist],l); else m[dist]=l; } ans = min(ans,centroid_decomposition(w)); } } return ans; } int best_path(int N, int K, int H[][2], int L[]){ 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]}); } k=K; int ans = centroid_decomposition(0); return (ans==1000001?-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...