Submission #318630

#TimeUsernameProblemLanguageResultExecution timeMemory
318630nikatamlianiCarnival Tickets (IOI20_tickets)C++14
100 / 100
1123 ms86116 KiB
#include <bits/stdc++.h>
#include "tickets.h"
using namespace std;
#define ll long long
ll find_maximum(int k, vector < vector < int > > x) {
    #define f first
    #define s second
    int n = x.size();
    int m = x[0].size();
    vector < pair < int, int > > L(n);
    stack < int > s[n], candidates[n];
    priority_queue < pair < int, int > > q;
    ll answer = 0; 
    for(int p = 0; p < n; ++p) {
        L[p].s = p; 
        for(int i = m - 1; i >= m - k; --i) {
            s[p].push(x[p][i]);
            answer += x[p][i];
        }
        for(int i = m - 1; i >= 0; --i) {
            candidates[p].push(x[p][i]); 
        }
        if(!s[p].empty() && !candidates[p].empty()) {
            q.push({-(s[p].top() + candidates[p].top()), p});
        }
    }
    for(int rep = 0; rep < n * k / 2; ++rep) {
        assert(q.size() > 0);
        auto [x, y] = q.top();
        q.pop();
        s[y].pop();
        candidates[y].pop();
        answer += x; 
        ++L[y].f;
        if(!s[y].empty() && !candidates[y].empty()) {
            q.push({-(s[y].top() + candidates[y].top()), y});
        }
    }
    vector < vector < int > > less(n, vector < int >()), more(n, vector < int >());
    for(int i = 0; i < n; ++i) {
        for(int j = 0; j < L[i].f; ++j) {
            less[i].push_back(j);
        }
        for(int j = m - (k - L[i].f); j < m; ++j) {
            more[i].push_back(j);
        }
    }
    vector < vector < int > > ans(n, vector < int > (m, -1));
    for(int i = 0; i < k; ++i) {
        sort(L.rbegin(), L.rend());
        for(int j = 0; j < n / 2; ++j) {
            assert(L[j].f > 0);
            assert(less[L[j].s].size() > 0);
            ans[L[j].second][less[L[j].s].back()] = i;
            --L[j].f;
            less[L[j].s].pop_back();
        }
        for(int j = n / 2; j < n; ++j) {
            assert(more[L[j].s].size() > 0);
            ans[L[j].second][more[L[j].s].back()] = i;
            more[L[j].s].pop_back();
        }
    }
    allocate_tickets(ans);
    return answer;
}
// int main() {
//     cout << find_maximum(1, {{5, 9}, {1, 4}, {3, 6}, {2, 7}}) << '\n';
// }

Compilation message (stderr)

tickets.cpp: In function 'long long int find_maximum(int, std::vector<std::vector<int> >)':
tickets.cpp:29:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   29 |         auto [x, y] = q.top();
      |              ^
#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...