제출 #1123664

#제출 시각아이디문제언어결과실행 시간메모리
1123664_uros9경주 (Race) (IOI11_race)C++20
100 / 100
367 ms31484 KiB
#include <bits/stdc++.h> #include "race.h" using namespace std; const int MAXN=200009,INF=1000000009; int dist[1000009]; int siz[MAXN]; bool was[MAXN]; int X; vector<int> za_brisati; vector<pair<int,int>> graf[MAXN]; int init_siz(int node,int pret){ siz[node]=1; for(auto x:graf[node]){ if(x.first==pret||was[x.first]) continue; siz[node]+=init_siz(x.first,node); } return siz[node]; } int Centroid(int node,int pret,int n){ for(auto x:graf[node]){ if(x.first==pret||was[x.first]) continue; if(siz[x.first]*2>n) return Centroid(x.first,node,n); } return node; } int rez=INF; void C_query(int node,int pret,int tr_dist,int brojac){ if(tr_dist>X) return; za_brisati.push_back(tr_dist); rez=min(rez,brojac+dist[X-tr_dist]); for(auto x:graf[node]){ if(x.first==pret||was[x.first]) continue; C_query(x.first,node,tr_dist+x.second,brojac+1); } } void C_upd(int node,int pret,int tr_dist,int brojac){ if(tr_dist>X) return; dist[tr_dist]=min(dist[tr_dist],brojac); for(auto x:graf[node]){ if(x.first==pret||was[x.first]) continue; C_upd(x.first,node,tr_dist+x.second,brojac+1); } } void CD(int poc){ int n=init_siz(poc,-1); int C=Centroid(poc,-1,n); dist[0]=0; for(auto x:graf[C]){ if(was[x.first]) continue; C_query(x.first,C,x.second,1); C_upd(x.first,C,x.second,1); } for(auto x:za_brisati) dist[x]=INF; za_brisati.clear(); was[C]=1; for(auto x:graf[C]){ if(was[x.first]) continue; CD(x.first); } } int best_path(int N, int K, int H[][2], int L[]){ X=K; for(int i=0; i<1000009; i++) dist[i]=INF; for(int i=0; i<N-1; i++){ int a=H[i][0],b=H[i][1],w=L[i]; graf[a].push_back({b,w}); graf[b].push_back({a,w}); } CD(0); if(K==0) return 0; return (rez<MAXN?rez:-1); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...