Submission #131116

#TimeUsernameProblemLanguageResultExecution timeMemory
131116eohomegrownappsRace (IOI11_race)C++14
100 / 100
598 ms82936 KiB
#include "race.h" #include <bits/stdc++.h> using namespace std; vector<vector<pair<int,int> > > adjlist; //weight, node vector<pair<int,int> > distdepth; vector<int> subtreesize; vector<set<pair<int,int> > > paths; //contains distance, depth vector<int> use; int currentMin; int k; int distances(int start, int parent){ int sumtrees = 0; for (auto p : adjlist[start]){ if (p.second==parent){ continue; } distdepth[p.second]=make_pair(distdepth[start].first+p.first,distdepth[start].second+1); sumtrees+=distances(p.second,start); } return subtreesize[start]=sumtrees+1; } void dfs(int start, int parent){ int maxsub = -1; int maxind = -1; for (auto p : adjlist[start]){ if (p.second==parent){ continue; } dfs(p.second,start); if (maxsub<subtreesize[p.second]){ maxind=p.second; maxsub=subtreesize[p.second]; } } //cout<<start<<"===="<<parent<<endl; auto st = distdepth[start]; //cout<<st.first<<" "<<st.second<<endl; if (maxind==-1){ paths[use[start]].insert(distdepth[start]); return; } use[start]=use[maxind]; //cout<<"added "<<distdepth[start].first<<" "<<distdepth[start].second<<" to "<<use[start]<<endl; //cout<<"using "<<use[start]<<endl; for (auto p : adjlist[start]){ if (p.second==maxind){ continue; } for (auto s : paths[use[p.second]]){ //cout<<"insert "<<s.first<<" "<<s.second<<endl; //check if it matches something in paths[use[maxind]] auto it = paths[use[start]].lower_bound(make_pair(k+st.first*2-s.first,0)); if (it!=paths[use[start]].end()&&(*it).first==k+st.first*2-s.first){ currentMin=min(currentMin,s.second+(*it).second-2*st.second); } } for (auto s : paths[use[p.second]]){ //add to set paths[use[start]].insert(s); } } auto it = paths[use[start]].lower_bound(make_pair(k+st.first,0)); if (it!=paths[use[start]].end()&&(*it).first==k+st.first){ currentMin=min(currentMin,(*it).second-st.second); } paths[use[start]].insert(distdepth[start]); } int best_path(int N, int K, int H[][2], int L[]) { k=K; adjlist.resize(N); for (int i = 0; i<N-1; i++){ adjlist[H[i][0]].push_back(make_pair(L[i],H[i][1])); adjlist[H[i][1]].push_back(make_pair(L[i],H[i][0])); } distdepth.resize(N,make_pair(-1,-1)); subtreesize.resize(N,-1); distdepth[0]=make_pair(0,0); distances(0,-1); paths.resize(N); use.resize(N); for (int i = 0; i<N; i++){ use[i]=i; } currentMin=N; dfs(0,-1); if (currentMin==N){ return -1; } else { return currentMin; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...