Submission #592061

#TimeUsernameProblemLanguageResultExecution timeMemory
592061HackapieRace (IOI11_race)C++17
9 / 100
385 ms8652 KiB
#include <bits/stdc++.h> #define ll long long int #define mp make_pair #include "race.h" using namespace std; int ans; vector<bool> vis; vector<vector<pair<int,int>>> g; vector<int> par; int kk; vector<int> sz; int timer=1; map<ll,ll> ok; map<int,int>add; void dfs_sz(int node,int p){ sz[node]=1; for(auto x:g[node]){ if(x.first==p)continue; if(vis[x.first])continue; dfs_sz(x.first,node); sz[node]+=sz[x.first]; } } int centroid(int &cnt,int node,int p){ for(auto x:g[node]){ if(x.first==p)continue; if(vis[x.first])continue; if(sz[x.first]>(cnt/2)){ centroid(cnt,x.first,node); } } return node; } void solve(int node,int p,ll dis,int cnt,vector<pair<ll,ll>> &info){ if(dis<=kk && ok[kk-dis]==timer){ //if a valid path exists ans=min(ans,cnt+add[kk-dis]); return; } if(dis<kk){ info.push_back({dis,cnt}); //record information for(auto x:g[node]){ if(x.first==p)continue; if(!vis[x.first]){ solve(x.first,node,dis+x.second,cnt+1,info); } } } } void create(int root,int p){ dfs_sz(root,p); //-> find size int c=centroid(sz[root],root,p); //find new centroid vis[c]=true; //visited ++timer; ok[0]=timer; add[0]=0; par[c]=root; //updating info for(auto x:g[c]){ //for every subtree in centroid find paths ..will help in finding if there exists some path that posses through centrod if(vis[x.first])continue; if(x.first==p)continue; vector<pair<ll,ll>> v; solve(x.first,c,x.second,1,v); for(auto y:v){ //updating info if(ok[y.first]==0){ ok[y.first]=timer; add[y.first]=y.second; }else{ if(add[y.first]>y.second){ ok[y.first]=timer; add[y.first]=y.second; } } } } for(auto x:g[c]){ if(x.first==p)continue; //centroid decom if(!vis[x.first])create(x.first,c); } } int best_path(int n, int k, int h[][2], int l[]) { ans=n+1; vis.clear(); sz.clear(); sz.resize(n+1); vis.resize(n+1); par.clear(); par.resize(n+1); g.resize(n+1); for(int i=1;i<=n;i++)g.clear(); timer=1; kk=k; ok.clear(); add.clear(); for(int i=0;i<n-1;i++){ g[h[i][0]].push_back({h[i][1],l[i]}); g[h[i][1]].push_back({h[i][0],l[i]}); } create(1,-1); if(ans==n+1)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...