Submission #1172537

#TimeUsernameProblemLanguageResultExecution timeMemory
1172537hyakupCarnival Tickets (IOI20_tickets)C++20
11 / 100
3100 ms256120 KiB
#include "tickets.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int, int>

long long find_maximum(int k, vector<vector<int>> v){
	int n = v.size(), m = v[0].size();
	vector<pii> ordem;
	for( int i = 0; i < n; i++ ) for( int j = 0; j < m; j++ ) ordem.push_back({ v[i][j], i*m + j });

	sort( ordem.begin(), ordem.end() );
	vector<int> cont(n);

	deque<pii> dq;
	for( auto p : ordem ) dq.push_back(p);

	vector<vector<int>> resp( n, vector<int>(m, -1));

	multiset<pair<int, int>> smin, smax;
	set<int> usados;

	for( int i = 0; i < k*n/2; i++ ){
		cont[dq.back().second/m]++;
		usados.insert(dq.back().second);
		smax.insert(dq.back());
		dq.pop_back();

		cont[dq.front().second/m]++;
		usados.insert(dq.front().second);
		smin.insert(dq.front());
		dq.pop_front();
	}

	for( int i = 0; i < n; i++ ){
		if( cont[i] <= k ){
			for( int j = 0; j < m; j++ ){
				smin.erase({ v[i][j], i*m + j });
				smax.erase({ v[i][j], i*m + j });
			}
		}
	}



	while( !smin.empty() || !smax.empty() ){
		while( !dq.empty() && cont[dq.back().second/m] >= k ) dq.pop_back();
		while( !dq.empty() && cont[dq.front().second/m] >= k ) dq.pop_front();

		if( smin.empty() || ( !smax.empty() && abs( smin.rbegin()->first - dq.front().first ) >= abs( smax.begin()->first - dq.back().first ) ) ){
			auto [val, id] = *smax.begin();
			smax.erase(smax.begin());
			usados.erase(id);
			id /= m;
			cont[id]--;

			if( cont[id] <= k ){
				for( int j = 0; j < m; j++ ){
					smin.erase({ v[id][j], id*m + j });
					smax.erase({ v[id][j], id*m + j });
				}
			}

			cont[dq.back().second/m]++;
			usados.insert(dq.back().second);
			dq.pop_back();
		}
		else{
			auto [val, id] = *smin.rbegin();
			smin.erase(prev(smin.end()));
			usados.erase(id);
			id /= m;
			cont[id]--;

			if( cont[id] <= k ){
				for( int j = 0; j < m; j++ ){
					smin.erase({ v[id][j], id*m + j});
					smax.erase({ v[id][j], id*m + j});
				}
			}

			cont[dq.front().second/m]++;
			usados.insert(dq.front().second);
			dq.pop_front();

		}
	}

	vector<vector<int>> vmax(n), vmin(n);

	ordem.clear();
	for( int x : usados ) ordem.push_back({ v[x/m][x%m], x });

	sort( ordem.begin(), ordem.end() );

	ll sum = 0;
	for( int i = 0; i < k*n/2; i++ ) vmin[ordem[i].second/m].push_back(ordem[i].second), sum -= ordem[i].first;
	for( int i = k*n/2; i < k*n; i++ ) vmax[ordem[i].second/m].push_back(ordem[i].second),sum += ordem[i].first;

	for( int i = 0; i < k; i++ ){
		vector<pii> aux;

		for( int j = 0; j < n; j++ ) aux.push_back({ (int)vmax[j].size() - (int)vmin[j].size(), j });
		sort( aux.begin(), aux.end() );

		for( int j = 0; j < n/2; j++ ){
			int id = vmin[aux[j].second].back(); vmin[aux[j].second].pop_back();
			resp[id/m][id%m] = i;
		}
		for( int j = n/2; j < n; j++ ){
			int id = vmax[aux[j].second].back(); vmax[aux[j].second].pop_back();
			resp[id/m][id%m] = i;
		}

	}
	allocate_tickets(resp);

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