Submission #1168929

#TimeUsernameProblemLanguageResultExecution timeMemory
1168929SmuggingSpunCarnival Tickets (IOI20_tickets)C++20
11 / 100
3 ms6728 KiB
#include "tickets.h" #include<bits/stdc++.h> using namespace std; typedef long long ll; template<class T>bool minimize(T& a, T b){ if(a > b){ a = b; return true; } return false; } template<class T>bool maximize(T& a, T b){ if(a < b){ a = b; return true; } return false; } const int lim = 1505; const int INF = 2e9; int n, m, k, a[lim][lim]; namespace sub1{ ll solve(){ vector<int>A; vector<vector<int>>s(n, vector<int>(m)); for(int i = 0; i < n; i++){ A.emplace_back(a[i][0]); s[i][0] = 0; } allocate_tickets(s); sort(A.begin(), A.end()); int median = A[n >> 1]; ll ans = 0; for(int& x : A){ ans += abs(x - median); } return ans; } } namespace sub2{ ll solve(){ vector<vector<int>>p(n, vector<int>(2)); for(int i = 0; i < n; i++){ if((p[i][0] = min_element(a[i], a[i] + m) - a[i]) == (p[i][1] = max_element(a[i], a[i] + m) - a[i])){ p[i][0] = 0; p[i][1] = 1; } } vector<pair<int, bool>>value; for(int i = 0; i < n; i++){ value.emplace_back(i, false); value.emplace_back(i, true); } sort(value.begin(), value.end(), [&] (auto i, auto j){ return a[i.first][p[i.first][i.second]] < a[j.first][p[j.first][j.second]]; }); vector<pair<int, int>>best; ll ans = 0; for(int i = 0; i < (n << 1); i++){ ll sum = -a[value[i].first][p[value[i].first][value[i].second]]; vector<int>cnt(n, 0); vector<bool>use(n, false); use[value[i].first] = true; vector<pair<int, int>>left, right; for(int j = i - 1; j > -1; j--){ if(++cnt[value[j].first] == 2){ left.emplace_back(value[j].first, p[value[j].first][value[j].second]); sum -= a[value[j].first][p[value[j].first][value[j].second]]; use[value[j].first] = true; } } fill(cnt.begin(), cnt.end(), 0); for(int j = i + 1; j < (n << 1); j++){ if(++cnt[value[j].first] == 2){ right.emplace_back(value[j].first, p[value[j].first][value[j].second]); sum += a[value[j].first][p[value[j].first][value[j].second]]; use[value[j].first] = true; } } if(left.size() < (n >> 1) && right.size() <= (n >> 1)){ vector<int>index, lv(n), rv(n), lp(n), rp(n); for(int j = 0; j < i; j++){ if(!use[value[j].first]){ index.emplace_back(value[j].first); lv[value[j].first] = a[value[j].first][lp[value[j].first] = p[value[j].first][value[j].second]]; } } for(int j = i + 1; j < (n << 1); j++){ if(!use[value[j].first]){ rv[value[j].first] = a[value[j].first][rp[value[j].first] = p[value[j].first][value[j].second]]; } } int median = a[value[i].first][p[value[i].first][value[i].second]]; sort(index.begin(), index.end(), [&] (int x, int y){ return abs(lv[x] - median) - abs(rv[x] - median) > abs(lv[y] - median) - abs(rv[y] - median); }); for(int j = (n >> 1) - int(left.size()) - 1; j > 0; ){ sum -= lv[index[--j]]; left.emplace_back(index[j], lp[index[j]]); } for(int j = (n >> 1) - int(left.size()) - 1; j < index.size(); j++){ sum += rv[index[j]]; right.emplace_back(index[j], rp[index[j]]); } if(maximize(ans, sum)){ left.emplace_back(value[i].first, p[value[i].first][value[i].second]); swap(best, left); for(auto& it : right){ best.emplace_back(it); } } } } vector<vector<int>>s(n, vector<int>(m, -1)); for(auto& [i, j] : best){ s[i][j] = 0; } allocate_tickets(s); return ans; } } ll find_maximum(int _k, vector<vector<int>>_x){ n = _x.size(); m = _x[0].size(); k = _k; for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ a[i][j] = _x[i][j]; } } if(m == 1){ return sub1::solve(); } if(k == 1){ return sub2::solve(); } }

Compilation message (stderr)

tickets.cpp: In function 'll find_maximum(int, std::vector<std::vector<int> >)':
tickets.cpp:137:1: warning: control reaches end of non-void function [-Wreturn-type]
  137 | }
      | ^
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...