Submission #1063185

#TimeUsernameProblemLanguageResultExecution timeMemory
1063185jamjanekCarnival Tickets (IOI20_tickets)C++14
100 / 100
2270 ms154676 KiB
#include "tickets.h"
#include <bits/stdc++.h>
using namespace std;


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

	vector<vector<int>>answer = x;
	for(i=0;i<n;i++)
		for(j=0;j<m;j++)
			answer[i][j] = -1;

	long long wynik = 0;
	priority_queue<pair<long long, pair<int, int>>>kolejka;
	vector<set<int>>dodatnie(n), ujemne(n);

	for(i=0;i<n;i++){
		for(j=m-k;j<m;j++){
			wynik+=x[i][j];
			dodatnie[i].insert(j);
		}
		kolejka.push({-(long long)x[i][m-k]-x[i][0], {i, 0}});
	}
//	int dl = m-k;
	for(int minus=0;minus<k*n/2;minus++){
		i = kolejka.top().second.first;
		j = kolejka.top().second.second;
		wynik+=kolejka.top().first;
//		printf("%d %d %d\n", i, j, wynik);
		kolejka.pop();
		ujemne[i].insert(j);
		dodatnie[i].erase(j+m-k);
		j++;
		if(j<k)
			kolejka.push({-(long long)x[i][m-k+j]-x[i][j], {i,j}});
	}
//	for(i=0;i<n;i++){
//		for(auto j: ujemne[i])printf("%d ", j);printf("\n");
//		for(auto j: dodatnie[i])printf("%d ", j);printf("\n");
//}	//exit(0);
	//0011111
	//1111100
	set<pair<int,int>>najwiecej;
	for(i=0;i<k;i++){
		najwiecej.clear();
		for(j=0;j<n;j++)najwiecej.insert({dodatnie[j].size(), j});
		
		for(int ij=0;ij<n;ij++){
			j = (*najwiecej.rbegin()).second;
			najwiecej.erase(*najwiecej.rbegin());
			if(ij<n/2){
				auto it = *dodatnie[j].begin();
				answer[j][it] = i;
				dodatnie[j].erase(it);
			}
			else{
				auto it = *ujemne[j].begin();
				answer[j][it] = i;
				ujemne[j].erase(it);
			}
		}
	}
	vector<vector<int>>res = x;
	long long w2 = 0;
	for(i=0;i<n;i++)
		for(j=0;j<m;j++){
			if(answer[i][j]>=0)
				res[i][answer[i][j]] = x[i][j];
		}
	for(i=0;i<k;i++){
		vector<int>wiersz;
		for(j=0;j<n;j++)
			wiersz.push_back(res[j][i]);
		sort(wiersz.begin(), wiersz.end());
		for(j=0;j<n;j++)
			if(j<n/2)
				w2-=wiersz[j];
			else
				w2+=wiersz[j];
	}
//	if(w2!=wynik)printf("%d %d!!!\n", wynik, w2);
//	exit(0);
	allocate_tickets(answer);
	return wynik;
	
}
#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...