Submission #1288430

#TimeUsernameProblemLanguageResultExecution timeMemory
1288430mariaclaraCarnival Tickets (IOI20_tickets)C++17
100 / 100
385 ms54376 KiB
#include "tickets.h"
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
typedef vector<int> vi;
#define all(x) x.begin(), x.end()
#define sz(x) (int)x.size()
#define mk make_pair
#define pb push_back
#define fr first
#define sc second

vi apear, ord;

ll find_maximum(int k, vector<vi> x) {
	int n = sz(x), m = sz(x[0]);
    vi qtd(n);
    ll TOT = 0;
    priority_queue<pii> sub, add;

	for(int i = 0; i < n/2; i++) {
        for(int j = 0; j < k; j++)
            TOT -= x[i][j];
        qtd[i] = k;
        sub.push({x[i][m-1] + x[i][k-1], i});
	}

    for(int i = n/2; i < n; i++) {
        for(int j = m-k; j < m; j++) 
            TOT += x[i][j];
        add.push({- x[i][m-k] - x[i][0], i});
	}

    while(sz(add) and sz(sub)) {
        auto [cost_i, i] = add.top();
        auto [cost_j, j] = sub.top();
        add.pop(); sub.pop();

        if(cost_i + cost_j <= 0) break;
        TOT += cost_i + cost_j;

        qtd[i]++;
        qtd[j]--;

        if(qtd[i] < k) add.push({- x[i][qtd[i]] - x[i][m-k+qtd[i]], i});
        if(qtd[j] > 0) sub.push({x[j][qtd[j]-1] + x[j][m-k+qtd[j]-1], j});
    }

    vector<vi> ans(n, vi(m, -1));

    apear.resize(k);
    ord.resize(k);
    for(int o = 0; o < k; o++) ord[o] = o;

    for(int i = 0; i < n; i++) {
        sort(all(ord), [](int a, int b){
            return mk(apear[a], a) > mk(apear[b], b);
        });

        for(int j = 0; j < qtd[i]; j++) 
            ans[i][j] = ord[j], apear[ord[j]]--;

        for(int j = m-k+qtd[i]; j < m; j++)
            ans[i][j] = ord[j-m+k], apear[ord[j-m+k]]++;
    }

	allocate_tickets(ans);
	return TOT;
}
#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...