제출 #598380

#제출 시각아이디문제언어결과실행 시간메모리
598380ono_de206경주 (Race) (IOI11_race)C++14
100 / 100
589 ms32452 KiB
#include "race.h" #include<bits/stdc++.h> using namespace std; #define pb push_back #define ff first #define ss second #define in insert const int mxn=2e5+10,mxk=1e6+10; vector<pair<int,int> > g[mxn]; int global_answer=-1,n,k,vis[mxn],sub[mxn],nxt,mx; int book_keeping,minimum_paths[mxk],achievable[mxk]; void dfs(int to,int fr) { sub[to]=1; for(auto &x : g[to]) { if(x.ff==fr || vis[x.ff]) continue; dfs(x.ff,to); sub[to]+=sub[x.ff]; } } void get_cen(int to,int fr,int sz) { int lomx=sz-sub[to]; for(auto &x : g[to]) { if(x.ff==fr || vis[x.ff]) continue; get_cen(x.ff,to,sz); lomx=max(lomx,sub[x.ff]); } if(lomx<mx) { mx=lomx; nxt=to; } } void dfs2(int to,int fr,int current_cost,int current_length,int fill) { if(current_cost>k) return; if (!fill) { if (achievable[k - current_cost] == book_keeping) if (current_length + minimum_paths[k - current_cost] < global_answer || global_answer == -1) global_answer = current_length + minimum_paths[k - current_cost]; if (current_cost == k) if (current_length < global_answer || global_answer == -1) global_answer = current_length; } else { if (achievable[current_cost] < book_keeping) { achievable[current_cost] = book_keeping; minimum_paths[current_cost] = current_length; } else if (current_length < minimum_paths[current_cost]) { achievable[current_cost] = book_keeping; minimum_paths[current_cost] = current_length; } } for(auto &x : g[to]) { if(x.ff==fr || vis[x.ff]) continue; dfs2(x.ff,to,current_cost+x.ss,current_length+1,fill); } } void solve(int id) { dfs(id,-1); if(sub[id]<=1) return; mx=sub[id]; get_cen(id,-1,sub[id]); id=nxt; book_keeping++; for(auto &x : g[id]) { if(vis[x.ff]) continue; dfs2(x.ff,id,x.ss,1,0); dfs2(x.ff,id,x.ss,1,1); } vis[id]=1; for(auto &x : g[id]) { if(vis[x.ff]) continue; solve(x.ff); } } int best_path(int N, int K, int h[][2], int l[]) { n=N; k=K; memset(vis,0,sizeof(vis)); for(int i=0; i<N-1; i++) { g[h[i][0]].pb({h[i][1],l[i]}); g[h[i][1]].pb({h[i][0],l[i]}); } solve(0); return global_answer; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...