Submission #1174181

#TimeUsernameProblemLanguageResultExecution timeMemory
1174181hyakupCarnival Tickets (IOI20_tickets)C++20
76 / 100
1612 ms215260 KiB
#include "tickets.h"
#include <bits/stdc++.h>
using namespace std;

#define ll long long

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

	vector<set<int>> smax(n), smin(n);
	ll resp = 0;
	vector<tuple<ll, int, int, int>> ordem;
	for( int i = 0; i < n; i++ ){
		for( int j = 0; j < k; j++ ){
			ordem.emplace_back( -v[i][j] - v[i][m - k + j], i, j, m - k + j );
			smax[i].insert(m - k + j);
			resp += v[i][m - k + j];
		}
	}

	sort( ordem.rbegin(), ordem.rend() );

	for( int t = 0; t < n*k/2; t++ ){
		auto [val, i, j1, j2] = ordem[t];
		resp += val;
		smax[i].erase(j2);
		smin[i].insert(j1);
	}

	vector<vector<int>> tickets( n, vector<int>(m, -1));
	vector<int> round(n);
	iota(round.begin(), round.end(), 0);
	for( int t = 0; t < k; t++ ){
		sort( round.begin(), round.end(), [&]( int a, int b ){
			return smax[a].size() < smax[b].size();
		});

		for( int i = 0; i < n/2; i++ ){
			tickets[round[i]][*smin[round[i]].begin()] = t;
			smin[round[i]].erase(smin[round[i]].begin());
		}
		for( int i = n/2; i < n; i++ ){
			tickets[round[i]][*smax[round[i]].begin()] = t;
			smax[round[i]].erase(smax[round[i]].begin());
		}
	}
	allocate_tickets(tickets);
	return resp;
}
#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...