Submission #586450

#TimeUsernameProblemLanguageResultExecution timeMemory
586450Drew_Carnival Tickets (IOI20_tickets)C++17
25 / 100
890 ms106016 KiB
#include "tickets.h"
#include <bits/stdc++.h>
using namespace std;

#define pb push_back
#define f1 first
#define s2 second

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

ll find_maximum(int K, vector<vector<int>> V)
{
	int N = (int)V.size(), M = (int)V[0].size();

	ll sum = 0;
	vector<vector<int>> ans(N, vector<int> (M, -1));

	vector<array<int, 3>> vec;
	for (int i = 0; i < N; ++i)
		for (int j = 0; j < M; ++j)
			vec.pb({V[i][j], i, j}), sum += V[i][j];
	sort(vec.begin(), vec.end());

	vector<vector<int>> low(N), high(N);

	// i: color
	// no same color can be on same contest i.e. ans[i] cannot contain two same integers
	for (int i = 0; i < N*M/2; ++i)
	{
		sum -= 2 * vec[i][0];
		low[vec[i][1]].pb(vec[i][2]);
	}

	for (int i = N*M/2; i < N*M; ++i)
		high[vec[i][1]].pb(vec[i][2]);

	vector<vector<bool>> used(N, vector<bool>(M, false));
	for (int i = 0, ctr = 0; i < N; ++i)
	{
		for (int j : low[i])
		{
			ans[i][j] = ctr; used[i][ctr] = true;
			ctr = (ctr + 1) % M;
		}
	}

	for (int i = 0; i < N; ++i)
	{
		for (int j = 0, k = 0; j < M; ++j)
		{
			if (ans[i][j] == -1)
			{
				while (used[i][k])
					++k;
				ans[i][j] = k++;
			}
		}
	}

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