Submission #430073

#TimeUsernameProblemLanguageResultExecution timeMemory
430073PetiFun Tour (APIO20_fun)C++14
100 / 100
402 ms22280 KiB
#include <bits/stdc++.h> #include "fun.h" using namespace std; bool check(vector<pair<int, int>> &v1, vector<pair<int, int>> &v2, vector<pair<int, int>> &v3, int d){ return max(d, (v3.empty() ? 0 : v3.back().first)) >= max((v1.empty() ? 0 : v1.back().first), (v2.empty() ? 0 : v2.back().first)); } void combine(vector<pair<int, int>> &v1, vector<pair<int, int>> &v2, vector<pair<int, int>> &v3, int &last, int d){ if(v3.size() == 0) return; if(v1.size() + v2.size() <= v3.size() && (last == 3 || check(v1, v2, v3, d))){ for(auto p : v2) v1.push_back(p); sort(v1.begin(), v1.end()); swap(v2, v3); v3.clear(); if(last == 2) last = 1; else if(last == 3) last = 2; } else if(v1.size() + v3.size() <= v2.size() && (last == 2 || check(v1, v3, v2, d))){ for(auto p : v3) v1.push_back(p); sort(v1.begin(), v1.end()); v3.clear(); if(last == 3) last = 1; } else if(v2.size() + v3.size() <= v1.size() && (last == 1 || check(v2, v3, v1, d))){ for(auto p : v3) v2.push_back(p); sort(v2.begin(), v2.end()); v3.clear(); if(last == 3) last = 2; } } vector<int> createFunTour(int N, int Q) { int c = 0; for(int i = 1; i < N; i++){ int ans = attractionsBehind(c, i); if(ans*2 > N) c = i; } //cout<<"centroid: "<<c<<"\n"; vector<int> tavC(N), inds; for(int i = 0; i < N; i++){ tavC[i] = hoursRequired(c, i); if(tavC[i] == 1) inds.push_back(i); } if(inds.size() < 2) return {0, 1}; vector<int> tav1(N), tav2(N); for(int i = 0; i < N; i++) tav1[i] = hoursRequired(inds[0], i); for(int i = 0; i < N; i++) tav2[i] = hoursRequired(inds[1], i); vector<pair<int, int>> v1, v2, v3; for(int i = 0; i < N; i++){ if(i == c) continue; if(tav1[i] < tav2[i] && tav1[i] < tavC[i]) v1.push_back(make_pair(tavC[i], i)); else if(tav2[i] < tav1[i] && tav2[i] < tavC[i]) v2.push_back(make_pair(tavC[i], i)); else v3.push_back(make_pair(tavC[i], i)); } if(v1.size() <= v2.size() && v1.size() <= v3.size()) v1.push_back(make_pair(0, c)); else if(v2.size() <= v1.size() && v2.size() <= v3.size()) v2.push_back(make_pair(0, c)); else v3.push_back(make_pair(0, c)); sort(v1.begin(), v1.end()); sort(v2.begin(), v2.end()); sort(v3.begin(), v3.end()); /*cout<<"csop1\n"; for(auto p : v1) cout<<p.first<<" "<<p.second<<"\n"; cout<<"csop2\n"; for(auto p : v2) cout<<p.first<<" "<<p.second<<"\n"; cout<<"csop3\n"; for(auto p : v3) cout<<p.first<<" "<<p.second<<"\n";*/ int last = 0, d = (int)1e9; combine(v1, v2, v3, last, d); if(v3.size() == 0){ last = 2; if(v2.size() > v1.size()) last = 1; } else{ last = 1; if(v2.back().first > v1.back().first) last = 2; if(v3.back().first > v2.back().first && v3.back().first > v1.back().first) last = 3; last++; if(last == 4) last = 1; } vector<int> ret; while(!v1.empty() || !v2.empty() || !v3.empty()){ if(v3.empty()){ if(last == 1){ if(v2.empty()) return ret; ret.push_back(v2.back().second); last = 2; v2.pop_back(); } else{ if(v1.empty()) return ret; ret.push_back(v1.back().second); last = 1; v1.pop_back(); } } else{ if(last == 1){ if(v2.empty() || v3.empty()) return {}; if(v2.back().first > v3.back().first){ ret.push_back(v2.back().second); last = 2; d = v2.back().first; v2.pop_back(); } else{ ret.push_back(v3.back().second); last = 3; d = v3.back().first; v3.pop_back(); } } else if(last == 2){ if(v2.empty() || v3.empty()) return {}; if(v1.back().first > v3.back().first){ ret.push_back(v1.back().second); last = 1; d = v1.back().first; v1.pop_back(); } else{ ret.push_back(v3.back().second); last = 3; d = v3.back().first; v3.pop_back(); } } else{ if(v1.empty() || v2.empty()) return {}; if(v1.back().first > v2.back().first){ ret.push_back(v1.back().second); last = 1; d = v1.back().first; v1.pop_back(); } else{ ret.push_back(v2.back().second); last = 2; d = v2.back().first; v2.pop_back(); } } combine(v1, v2, v3, last, d); } } return ret; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...