제출 #970038

#제출 시각아이디문제언어결과실행 시간메모리
970038lurhx경주 (Race) (IOI11_race)C++17
100 / 100
832 ms105908 KiB
#include "race.h" #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; using namespace std; #define ll long long #define mp make_pair #define f first #define s second const ll inf = 1e18; vector<vector<pair<ll,ll>>> edges; vector<bool> centroids; vector<ll> sizes; ll n,k; ll get_size(ll node, ll parent = -1) { ll res = 1; for(auto i: edges[node]) { if(centroids[i.f] || i.f==parent)continue; res+=get_size(i.f,node); } return sizes[node]=res; } ll get_centroid(ll node,ll _n,ll parent = -1) { for(auto i: edges[node]) { if(centroids[i.f] || i.f == parent)continue; if(sizes[i.f]*2>_n) return get_centroid(i.f,_n,node); } return node; } vector<gp_hash_table<ll,ll>>dp; void dfs(ll node,ll val,ll times,ll parent = -1) { if(dp.back().find(val)==dp.back().end()) dp.back()[val] = times; else dp.back()[val] = min(dp.back()[val],times); for(auto i: edges[node]) { if(i.f==parent || centroids[i.f]) continue; dfs(i.f,val+i.s,times+1,node); } } ll solve(ll node,int _n) { //find centroid; dp.clear(); get_size(node); ll centroid = get_centroid(node,_n); centroids[centroid] = true; for(auto i: edges[centroid]) { if(centroids[i.f])continue; dp.emplace_back(); dfs(i.f,i.s,1); } ll ans = inf; gp_hash_table<ll,ll> another; for(auto i : dp) { for(auto q:i) { if(q.f==k) ans = min(ans,q.s); else { if(another.find(k-q.f)!=another.end()) ans = min(ans,another[k-q.f]+q.s); } } for(auto q: i) { if(another.find(q.f)==another.end()) another[q.f] = q.s; else another[q.f] = min(another[q.f],q.s); } } //cout << dp.size() << endl; for(auto i: edges[centroid]) { if(!centroids[i.f]) ans = min(ans,solve(i.f,sizes[i.f])); } return ans; } int best_path(int N, int K, int H[][2], int L[]){ n = N; k = K; edges.resize(n); sizes.resize(n); centroids.resize(n); pair<ll,ll> in[n]; ll len[n]; for(int i = 0; i<n-1; i++) { in[i].f = H[i][0]; in[i].s = H[i][1]; len[i] = L[i]; edges[in[i].f].emplace_back(in[i].s,len[i]); edges[in[i].s].emplace_back(in[i].f,len[i]); } ll _ = solve(0,n); if(_ == inf) _ =-1; return _; } /* int main() { cin >> n >> k; edges.resize(n); sizes.resize(n); centroids.resize(n); pair<int,int> in[n]; int len[n]; for(int i = 0; i<n-1; i++) { cin >> in[i].f >> in[i].s >> len[i]; edges[in[i].f].emplace_back(in[i].s,len[i]); edges[in[i].s].emplace_back(in[i].f,len[i]); } auto _ = solve(0); if(_ == inf) _ =-1; cout << _; }*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...