Submission #302092

#TimeUsernameProblemLanguageResultExecution timeMemory
302092VEGAnnCarnival Tickets (IOI20_tickets)C++14
0 / 100
3 ms768 KiB
#include "tickets.h"
#include <bits/stdc++.h>
#define PB push_back
#define sz(x) ((int)x.size())
#define all(x) x.begin(),x.end()
#define i2 array<int,2>
#define i3 array<int,3>
using namespace std;
typedef long long ll;
const int N = 1600;
const ll OO = 1e18;
vector<i2> elms;
vector<int> vec[N][2];
vector<int> vc[2];
ll f[N][N];
int pre[N][N];

long long find_maximum(int k, vector<vector<int>> x) {
	int n = x.size();
	int m = x[0].size();

	vector<vector<int>> answer;

	for (int i = 0; i < n; i++) {
		std::vector<int> row(m);

		fill(all(row), -1);

		answer.push_back(row);
	}

	ll ans = 0;

    for (int i = 0; i < n; i++){
        for (int j = 0; j < n; j++)
            vec[i][x[i][j]].PB(j);
    }

    for (int itr = 0; itr < k; itr++){
        vc[0].clear();
        vc[1].clear();

        for (int i = 0; i < n; i++)
            if (sz(vec[i][0]) > sz(vec[i][1]))
                vc[0].PB(i);
            else vc[1].PB(i);

        if (sz(vc[0]) > sz(vc[1])){
            elms.clear();

            for (int i = 0; i < sz(vc[0]); i++) {
                int id = vc[0][i];

                elms.PB({sz(vec[id][1]), id});
            }

            sort(all(elms));

            while (sz(elms) > sz(vc[1])){
                if (elms.back()[0] == 0) break;

                vc[1].PB(elms.back()[1]);
                elms.pop_back();
            }

            ans += min(sz(elms), sz(vc[1]));

            for (i2 cr : elms){
                int id = cr[1];

                answer[id][vec[0][id].back()] = itr;
                vec[0][id].pop_back();
            }

            for (int id : vc[1]){
                answer[id][vec[1][id].back()] = itr;
                vec[1][id].pop_back();
            }
        } else {
            elms.clear();

            for (int i = 0; i < sz(vc[1]); i++) {
                int id = vc[1][i];

                elms.PB({sz(vec[id][0]), id});
            }

            sort(all(elms));

            while (sz(elms) > sz(vc[0])){
                if (elms.back()[0] == 0) break;

                vc[0].PB(elms.back()[1]);
                elms.pop_back();
            }

            ans += min(sz(elms), sz(vc[0]));

            for (i2 cr : elms){
                int id = cr[1];

                answer[id][vec[1][id].back()] = itr;
                vec[1][id].pop_back();
            }

            for (int id : vc[0]){
                answer[id][vec[0][id].back()] = itr;
                vec[0][id].pop_back();
            }
        }
    }

    allocate_tickets(answer);

	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...