Submission #1172539

#TimeUsernameProblemLanguageResultExecution timeMemory
1172539hyakupCarnival Tickets (IOI20_tickets)C++20
11 / 100
3100 ms256100 KiB
#include "tickets.h" #include <bits/stdc++.h> using namespace std; #define ll long long #define pii pair<int, int> long long find_maximum(int k, vector<vector<int>> v){ int n = v.size(), m = v[0].size(); vector<pii> ordem; for( int i = 0; i < n; i++ ) for( int j = 0; j < m; j++ ) ordem.push_back({ v[i][j], i*m + j }); sort( ordem.begin(), ordem.end() ); vector<int> cont(n); deque<pii> dq; for( auto p : ordem ) dq.push_back(p); vector<vector<int>> resp( n, vector<int>(m, -1)); set<pair<int, int>> smin, smax; set<int> usados; for( int i = 0; i < k*n/2; i++ ){ cont[dq.back().second/m]++; usados.insert(dq.back().second); smax.insert(dq.back()); dq.pop_back(); cont[dq.front().second/m]++; usados.insert(dq.front().second); smin.insert(dq.front()); dq.pop_front(); } for( int i = 0; i < n; i++ ){ if( cont[i] <= k ){ for( int j = 0; j < m; j++ ){ smin.erase({ v[i][j], i*m + j }); smax.erase({ v[i][j], i*m + j }); } } } while( !smin.empty() || !smax.empty() ){ while( !dq.empty() && cont[dq.back().second/m] >= k ) dq.pop_back(); while( !dq.empty() && cont[dq.front().second/m] >= k ) dq.pop_front(); if( smin.empty() || ( !smax.empty() && abs( smin.rbegin()->first - dq.front().first ) >= abs( smax.begin()->first - dq.back().first ) ) ){ auto [val, id] = *smax.begin(); smax.erase(smax.begin()); usados.erase(id); id /= m; cont[id]--; if( cont[id] <= k ){ for( int j = 0; j < m; j++ ){ smin.erase({ v[id][j], id*m + j }); smax.erase({ v[id][j], id*m + j }); } } cont[dq.back().second/m]++; usados.insert(dq.back().second); dq.pop_back(); } else{ auto [val, id] = *smin.rbegin(); smin.erase(prev(smin.end())); usados.erase(id); id /= m; cont[id]--; if( cont[id] <= k ){ for( int j = 0; j < m; j++ ){ smin.erase({ v[id][j], id*m + j}); smax.erase({ v[id][j], id*m + j}); } } cont[dq.front().second/m]++; usados.insert(dq.front().second); dq.pop_front(); } } vector<vector<int>> vmax(n), vmin(n); ordem.clear(); for( int x : usados ) ordem.push_back({ v[x/m][x%m], x }); sort( ordem.begin(), ordem.end() ); ll sum = 0; for( int i = 0; i < k*n/2; i++ ) vmin[ordem[i].second/m].push_back(ordem[i].second), sum -= ordem[i].first; for( int i = k*n/2; i < k*n; i++ ) vmax[ordem[i].second/m].push_back(ordem[i].second),sum += ordem[i].first; vector<int> aux(n); iota( aux.begin(), aux.end(), 0 ); for( int i = 0; i < k; i++ ){ sort( aux.begin(), aux.end(), [&]( int a, int b ){ return (int)vmax[a].size() - (int)vmin[a].size() < (int)vmax[b].size() - (int)vmin[b].size(); }); for( int j = 0; j < n/2; j++ ){ int id = vmin[aux[j]].back(); vmin[aux[j]].pop_back(); resp[id/m][id%m] = i; } for( int j = n/2; j < n; j++ ){ int id = vmax[aux[j]].back(); vmax[aux[j]].pop_back(); resp[id/m][id%m] = i; } } allocate_tickets(resp); return sum; }
#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...