Submission #1230512

#TimeUsernameProblemLanguageResultExecution timeMemory
1230512Hamed_GhaffariCarnival Tickets (IOI20_tickets)C++20
100 / 100
469 ms63256 KiB
#include "tickets.h"
#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using pii = pair<int, int>;

#define X first
#define Y second

ll find_maximum(int k, vector<vector<int>> a) {
    int n = a.size(), m = a[0].size();
    vector<vector<int>> ord(n, vector<int>(m));
    ll ans = 0;
    vector<int> cnt(n, 0);
    priority_queue<pii> pq;
    for(int i=0; i<n; i++) {
        iota(ord[i].begin(), ord[i].end(), 0);
        sort(ord[i].begin(), ord[i].end(), [&](int x, int y) {
            return a[i][x] < a[i][y];
        });
        for(int j=0; j<k; j++) ans -= a[i][ord[i][j]];
        pq.push({a[i][ord[i][m-1]]+a[i][ord[i][k-1]], i});
    }
    for(int t=0; t<n*k/2; t++) {
        pii d = pq.top();
        pq.pop();
        ans += d.X;
        if((++cnt[d.Y])<k)
            pq.push({a[d.Y][ord[d.Y][m-1-cnt[d.Y]]]+a[d.Y][ord[d.Y][k-1-cnt[d.Y]]], d.Y});
    }
    vector<int> L(n, 0), R(n, m-1);
    vector<vector<int>> b(n, vector<int>(m, -1));
    for(int r=0; r<k; r++) {
        int ct=0;
        vector<bool> mark(n, 0);
        for(int i=0; i<n; i++)
            if(cnt[i]==k-r) {
                b[i][ord[i][R[i]--]] = r;
                cnt[i]--;
                mark[i] = 1;
                ct++;
            }
        for(int i=0; i<n && ct<n/2; i++)
            if(!mark[i] && cnt[i]) {
                b[i][ord[i][R[i]--]] = r;
                cnt[i]--;
                mark[i] = 1;
                ct++;
            }
        for(int i=0; i<n; i++)
            if(!mark[i])
                b[i][ord[i][L[i]++]] = r;
    }
    allocate_tickets(b);
    return ans;
}
#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...