Submission #674859

#TimeUsernameProblemLanguageResultExecution timeMemory
674859VodkaInTheJarCarnival Tickets (IOI20_tickets)C++14
41 / 100
3089 ms66096 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});

    vector <int> cnt0(k, 0); 
    vector <int> maxs(k, 0);
    for (auto i: vec)
        if (i.second.first < 0) {
            for (auto it = prev(s.end()); ; it--) {
                if (!used[it->second][-i.second.first-1] && cnt0[it->second] < n / 2) {
                    cnt0[it->second]++; 
                    maxs[it->second] = max(maxs[it->second], i.first);
                    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;
                }
            }
        }

    vector <pair <int, int> > v; 
    for (int i = 0; i < k; i++)
        v.push_back({maxs[i], i});
    
    sort (v.begin(), v.end());
    reverse(v.begin(), v.end());

    vector <int> cnt1(k, 0);
    for (auto i: vec)
        if (i.second.first >= 0) {
            for (auto j: v)
                if (i.first >= j.first && !used[j.second][i.second.first] && cnt1[j.second] < n / 2) {
                    cnt1[j.second]++;
                    used[j.second][i.second.first] = true;
                    r[i.second.first][i.second.second] = j.second;
                    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...