Submission #433029

#TimeUsernameProblemLanguageResultExecution timeMemory
433029GurbanRace (IOI11_race)C++17
100 / 100
726 ms37272 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int N = 1e6+5; const int maxn=2e5+5; int cnt[N],ans = 1e9; int sub[maxn],k; bool done[maxn]; vector<int>v; vector<pair<int,int>>E[maxn]; void dfs(int nd,int pr){ sub[nd] = 1; for(auto i : E[nd]) if(i.first != pr and !done[i.first]) dfs(i.first,nd), sub[nd] += sub[i.first]; } int cent(int nd){ int sz = sub[nd]; while(1){ pair<int,int>mx = {0,0}; for(auto i : E[nd]){ if(!done[i.first] and sub[i.first] < sub[nd] and sub[i.first] > mx.first) mx = {sub[i.first],i.first}; } if(mx.first * 2 <= sz) return nd; nd = mx.second; } } void calc(int nd,int pr,int lvl,ll ds){ if(ds <= k){ assert(k-ds < N and k-ds >= 0); ans = min(ans,cnt[k-ds] + lvl); } for(auto i : E[nd]) if(i.first != pr and !done[i.first]) calc(i.first,nd,lvl+1,ds+i.second); } void put(int nd,int pr,int lvl,ll ds){ if(ds <= k){ assert(ds < N and ds >= 0); cnt[ds] = min(cnt[ds],lvl); v.push_back(ds); } for(auto i : E[nd]) if(i.first != pr and !done[i.first]) put(i.first,nd,lvl+1,i.second+ds); } void f(int nd){ dfs(nd,-1); int cen = cent(nd); done[cen] = 1; sub[cen] = sub[nd]; // cout<<cen<<' '; for(auto i : E[cen]){ if(!done[i.first]){ // if(cen == 1) cout<<i.first<<' '; calc(i.first,cen,1,i.second); put(i.first,cen,1,i.second); } } for(auto i : v) cnt[i] = 1e9; v.clear(); for(auto i : E[cen]) if(!done[i.first]) f(i.first); } int best_path(int n,int K,int h[][2],int l[]){ k = K; for(int i = 0;i < n-1;i++){ E[h[i][0]].push_back({h[i][1],l[i]}); E[h[i][1]].push_back({h[i][0],l[i]}); } for(int i = 1;i < N;i++) cnt[i] = 1e9; f(0); // cout<<'\n'; if(ans == 1e9) ans = -1; return ans; } // int main(){ // ios::sync_with_stdio(false); // cin.tie(0); // int n,k; // cin >> n >> k; // int H[n-1][2],L[n-1]; // for(int i = 0;i < n-1;i++) cin >> H[i][0] >> H[i][1] >> L[i]; // cout<<best_path(n,k,H,L); // }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...