Submission #476287

#TimeUsernameProblemLanguageResultExecution timeMemory
476287uroskRace (IOI11_race)C++14
100 / 100
1169 ms47696 KiB
#include "race.h" // __builtin_popcount(x) broj bitova // __builtin_popcountll(x) long long #define here cerr<<"---------------------------\n" #include "bits/stdc++.h" #include <ext/pb_ds/tree_policy.hpp> #include <ext/pb_ds/assoc_container.hpp> #define ld double #define ll long long #define ull unsigned long long #define llinf 100000000000000000LL // 10^17 #define iinf 2000000000 // 2*10^9 #define pb push_back #define popb pop_back #define fi first #define sc second #define endl '\n' #define pii pair<int,int> #define pll pair<ll,ll> #define pld pair<ld,ld> #define sz(a) int(a.size()) #define all(a) a.begin(),a.end() #define rall(a) a.begin(),a.end(),greater<int>() #define getunique(v) {sort(all(v)); v.erase(unique(all(v)), v.end());} using namespace std; using namespace __gnu_pbds; typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> ordered_set; #define maxn 200005 vector<pll> g[maxn]; ll n,k,c; bool vis[maxn]; ll ans = llinf; ll dfs_siz(ll u,ll par){ ll siz = 1; for(pll p : g[u]){ ll v = p.fi; if(vis[v]||v==par) continue; siz+=dfs_siz(v,u); } return siz; } ll decomp(ll u,ll par,ll m){ ll siz = 1; bool ok = 1; for(pll p : g[u]){ ll v = p.fi; if(vis[v]||v==par) continue; ll e = decomp(v,u,m); if(e>m/2) ok = 0; siz+=e; } if(siz<m/2) ok = 0; if(ok) c = u; return siz; } void dfs(ll u,ll par,ll len,ll j){ if(len==k) ans = min(ans,j); if(len>=k) return; for(pll p : g[u]){ ll v = p.fi; ll w = p.sc; if(vis[v]||v==par) continue; dfs(v,u,len+w,j+1); } } map<ll,ll> cnt; vector<pll> tmp; void calc(ll u,ll par,ll len,ll j){ if(len>k) return; if(cnt.find(k-len)!=cnt.end()) ans = min(ans,cnt[k-len]+j); tmp.pb({len,j}); for(pll p : g[u]){ ll v = p.fi; ll w = p.sc; if(vis[v]||v==par) continue; calc(v,u,len+w,j+1); } } void solve(ll u){ decomp(u,u,dfs_siz(u,u)); //cerr<<u<< " "<<c<<endl; dfs(c,c,0,0); vis[c] = 1; cnt.clear(); for(pll p : g[c]){ ll v = p.fi; ll w = p.sc; if(vis[v]) continue; calc(v,v,w,1); while(!tmp.empty()){ ll id = tmp.back().fi; ll len = tmp.back().sc; tmp.popb(); if(cnt.find(id)==cnt.end()) cnt[id] = len; else cnt[id] = min(cnt[id],len); } } ll r = c; for(pll p : g[r]){ ll v = p.fi; if(vis[v]) continue; solve(v); } } int best_path(int N, int K, int H[][2], int L[]) { n = N; k = K; for(ll i = 1;i<=n-1;i++){ ll x = H[i-1][0],y = H[i-1][1],w = L[i-1]; x++; y++; g[x].pb({y,w}); g[y].pb({x,w}); } solve(1); if(ans==llinf) ans = -1; 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...