Submission #674853

#TimeUsernameProblemLanguageResultExecution timeMemory
674853VodkaInTheJarCarnival Tickets (IOI20_tickets)C++14
0 / 100
0 ms212 KiB
#include <bits/stdc++.h>
#include <cstdio>
#pragma GCC optimize("O3")
#define endl '\n'

using namespace std;

void allocate_tickets(vector <vector <int> > r);
long long find_maximum(int k, vector <vector <int> > x) {
    int n = (int)x.size(), m = (int)x[0].size();
    vector <int> taken(n, k);
    long long ans = 0;
    int balance = 0; 
    priority_queue <pair <int, int> > pq; 
    for (int i = 0; i < n; i++) {
        for (int j = m - k; j < m; j++)
            ans += x[i][j];

        taken[i] = k;
        balance += k; 
        pq.push({-x[i][m-k]-x[i][0], i});
    }

    while (balance > 0) {
        pair <int, int> curr = pq.top();
        pq.pop();

        ans += curr.first;
        balance -= 2; 
        taken[curr.second]--;
        if (taken[curr.second] != 0)
            pq.push({-x[curr.second][m-taken[curr.second]]-x[curr.second][k-taken[curr.second]], curr.second});
    }

    vector <pair <int, pair <int, int> > > vec; 
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < k - taken[i]; j++)
            vec.push_back({x[i][j], {-i-1, j}});
    
        for (int j = m - taken[i]; j < m; j++)
            vec.push_back({x[i][j], {i, j}});
    }
    
    sort (vec.begin(), vec.end());
    set <pair <int, int> > s;
    vector <vector <int> > r(n, vector <int> (m, -1));
    vector <vector <bool> > used(k, vector <bool> (n, false));
    for (int i = 0; i < k; i++)
        s.insert({0, i});

    for (auto i: vec)
        if (i.second.first < 0) {
            for (auto it = prev(s.end()); ; it--) {
                if (!used[it->second][-i.second.first-1]) {
                    used[it->second][-i.second.first-1] = true;
                    r[-i.second.first-1][i.second.second] = it->second;
                    auto to_insert = *it; 
                    to_insert.first--;

                    s.erase(it);
                    s.insert(to_insert);
                    break;
                }
            }
        }

    for (auto i: vec)
        if (i.second.first >= 0) {
            for (auto it = s.begin(); ; it++) {
                if (!used[it->second][i.second.first]) {
                    used[it->second][i.second.first] = true;
                    r[i.second.first][i.second.second] = it->first;
                    auto to_insert = *it; 
                    to_insert.first++;

                    s.erase(it);
                    s.insert(to_insert);
                    break;
                }
            }
        }

    allocate_tickets(r);

    /*
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++)
            cout << r[i][j] << " ";

        cout << endl; 
    }
    */

    return ans; 
}

/*
int n, m, k;
int main() {
    cin >> n >> m >> k;
    vector <vector <int> > x(n, vector <int> (m));
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            cin >> x[i][j];

    cout << find_maximum(k, x) << endl;
}
*/
#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...