Submission #1169009

#TimeUsernameProblemLanguageResultExecution timeMemory
1169009SmuggingSpunCarnival Tickets (IOI20_tickets)C++20
41 / 100
617 ms71520 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(right.size()); j > 0; j--){ int t = int(index.size()) - j; sum += rv[index[t]]; right.emplace_back(index[t], rp[index[t]]); } 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; } } namespace sub4{ ll solve(){ vector<pair<int, int>>p; for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ p.emplace_back(i, j); } } sort(p.begin(), p.end(), [&] (auto i, auto j){ return a[i.first][i.second] > a[j.first][j.second]; }); vector<vector<bool>>big(n, vector<bool>(m, false)); for(int i = (n * m) >> 1; i > 0; ){ i--; big[p[i].first][p[i].second] = true; } vector<vector<int>>ans(n, vector<int>(m)); ll sum = 0; priority_queue<pair<int, int>>pq; for(int i = 0; i < m; i++){ pq.emplace(n >> 1, i); } for(int i = 0; i < n; i++){ for(int t = 0; t < m; t++){ if(big[i][t]){ sum += a[i][t]; auto [u, v] = pq.top(); pq.pop(); if(u > 0){ pq.emplace(u - 1, v); } ans[i][t] = v; } } } for(int i = 0; i < n; i++){ vector<bool>use(m, false); for(int t = 0; t < m; t++){ if(big[i][t]){ use[ans[i][t]] = true; } } vector<int>I; for(int t = 0; t < m; t++){ if(!use[t]){ I.emplace_back(t); } } for(int t = 0; t < m; t++){ if(!big[i][t]){ sum -= a[i][t]; ans[i][t] = I.back(); I.pop_back(); } } } allocate_tickets(ans); return sum; } } 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(); } if(k == m){ return sub4::solve(); } }

Compilation message (stderr)

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