Submission #302616

#TimeUsernameProblemLanguageResultExecution timeMemory
302616arthurconmyCarnival Tickets (IOI20_tickets)C++14
25 / 100
1166 ms84420 KiB
#include <bits/stdc++.h>
using namespace std;
#ifndef ARTHUR_LOCAL
	#include "tickets.h"
#endif

using ll = long long;

#define len(x) int((x).size())
#define ff first
#define ss second

#ifdef ARTHUR_LOCAL
	void allocate_tickets(vector<vector<int>> ans)
	{
		for(auto a:ans)
		{
			for(auto b:a) cout << b << " ";
			cout << endl;

		}
	}
#endif

ll find_maximum(int k, vector<vector<int>> X) 
{
	int n = len(X);
	int m = len(X[0]);
	vector<vector<int>> answer;

	for (int i = 0; i < n; i++) 
	{
		vector<int> row(m);
		for(int j = 0; j < m; j++) 
		{
			row[j] = -1;
		}
		answer.push_back(row);
	}

	vector<pair<int,pair<int,int>>> V;

	for(int i=0; i<n; i++)
	{
		for(int j=0; j<m; j++)
		{
			V.push_back({X[i][j],{i,j}});
		}
	}

	// cout << "here" << endl;

	sort(V.begin(), V.end());
	vector<pair<vector<int>,vector<int>>> V2(n);

	ll ans=0LL;
	ll mid = V[int((n*m)/2)].ff;

	for(int i=0; i<int((n*m)/2); i++)
	{
		V2[V[i].ss.ff].ff.push_back(V[i].ss.ss);
		ans += abs(mid - V[i].ff);
	}

	for(int i=int((n*m)/2); i<n*m; i++)
	{
		V2[V[i].ss.ff].ss.push_back(V[i].ss.ss);
		ans += abs(mid - V[i].ff);
	}

	// cout << "here" << endl;

	for(int round=0; round<k; round++)
	{
		int mins=0;
		int maxes=0;

		// cout << "here" << endl;

		for(int i=0; i<n; i++)
		{
			if(round == k-1)
			{
				// cout << V2[i].ff.size() << " " << V2[i].ss.size() << " ayeet" << endl;
				// cout << V2[i].ss.back() << endl;
			}

			if(V2[i].ff.empty())
			{
				// cout << V2[i].ss.back() << endl;

				maxes++;
				answer[i][V2[i].ss.back()]=round;
				V2[i].ss.pop_back();
				continue;
			}

			if(V2[i].ss.empty())
			{
				mins++;
				answer[i][V2[i].ff.back()]=round;
				V2[i].ff.pop_back();
			}
		}

		// cout << len(V2[0].ff) << " " << len(V2[0].ss) << endl;

		for(int i=0; i<n; i++)
		{
			if(V2[i].ff.empty() || V2[i].ss.empty()) continue;

			if(maxes < int(n/2))
			{
				maxes++;
				answer[i][V2[i].ss.back()]=round;
				V2[i].ss.pop_back();
			}

			else
			{
				mins++;
				answer[i][V2[i].ff.back()]=round;
				V2[i].ff.pop_back();
			}
		}
	}

	// cout << ans << endl;

	allocate_tickets(answer);
	return ans; // min(no_zeroes, n*m-no_zeroes);
}

#ifdef ARTHUR_LOCAL
int main()
{
	find_maximum(3, {{1,1,1},{1,1,1}});
}
#endif
#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...