Submission #288224

#TimeUsernameProblemLanguageResultExecution timeMemory
288224adminFun Tour (APIO20_fun)C++17
100 / 100
418 ms20720 KiB
// https://raw.githubusercontent.com/koosaga/olympiad/master/APIO/apio20_fun.cpp #include "fun.h" #include <bits/stdc++.h> #define sz(v) ((int)(v).size()) #define all(v) (v).begin(), (v).end() using namespace std; using lint = long long; using pi = pair<int, int>; const int MAXN = 505; const int mod = 1e9 + 7; vector<int> createFunTour(int N, int Q) { int n = N; vector<int> dist(n); pi dap(1e9, 1e9); for(int i=0; i<n; i++){ int foo = attractionsBehind(0, i); if(2 * foo > n){ dap = min(dap, pi(foo, i)); } } int C = dap.second; vector<int> adj; for(int i=0; i<n; i++){ dist[i] = hoursRequired(C, i); if(dist[i] == 1) adj.push_back(i); } vector<int> sons[3]; for(int i=0; i<n; i++){ if(i == C) continue; int put = 0; for(int j=1; j<sz(adj); j++){ if(hoursRequired(adj[j], i) == dist[i] - 1){ put = j; break; } } sons[put].push_back(i); } for(int i=0; i<sz(adj); i++){ sort(all(sons[i]), [&](const int &a, const int &b){ return dist[a] < dist[b]; }); } vector<int> ans; auto majority = [&](){ int sum = sz(sons[0]) + sz(sons[1]) + sz(sons[2]); for(int i=0; i<3; i++){ if(sz(sons[i]) * 2 >= sum) return i; } return -1; }; int prv = -1; if(majority() == -1){ while(true){ vector<int> v; for(int j=0; j<sz(adj); j++){ assert(sz(sons[j])); v.push_back(j); } sort(all(v), [&](const int &a, const int &b){ int da = dist[sons[a].back()]; int db = dist[sons[b].back()]; if(da != db) return da > db; return (a != prv) > (b != prv); }); if(v[0] == prv) prv = v[1]; else prv = v[0]; assert(sz(sons[prv])); ans.push_back(sons[prv].back()); sons[prv].pop_back(); if(prv == v[0] && majority() != -1) break; } } int foo = sz(ans); int w = majority(); vector<pi> x, y; for(int i=0; i<3; i++){ for(auto &j : sons[i]){ if(i == w) x.emplace_back(j, i); else y.emplace_back(j, i); } } auto cmp = [&](const pi &a, const pi &b){ if(dist[a.first] != dist[b.first]){ return dist[a.first] > dist[b.first]; } return (a.second != prv) < (b.second != prv); }; assert(abs(sz(x) - sz(y)) <= 1); sort(all(x), cmp); sort(all(y), cmp); if(sz(x) && sz(y) && x[0].first < y[0].first) swap(x, y); if(sz(x) && x[0].second == prv) swap(x, y); if(sz(x) <= sz(y)) x.emplace_back(C, -1); else y.emplace_back(C, -1); for(int i=0; i<sz(x); i++){ ans.push_back(x[i].first); if(i < sz(y)) ans.push_back(y[i].first); } /* for(int i=2; i<sz(ans); i++){ if(hoursRequired(ans[i-2], ans[i-1]) < hoursRequired(ans[i-1], ans[i])){ puts("---"); cout << foo << endl; for(auto &j : ans) printf("%d " , j); puts(""); } }*/ return ans; }

Compilation message (stderr)

fun.cpp: In function 'std::vector<int> createFunTour(int, int)':
fun.cpp:76:6: warning: unused variable 'foo' [-Wunused-variable]
   76 |  int foo = sz(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...
#Verdict Execution timeMemoryGrader output
Fetching results...