Submission #400935

#TimeUsernameProblemLanguageResultExecution timeMemory
400935priority_queueCarnival Tickets (IOI20_tickets)C++14
27 / 100
634 ms54496 KiB

#include <bits/stdc++.h>

using namespace std;

#define forint(i, N) for (int i = 0; i < (N); i++)

using namespace std;

void allocate_tickets(vector< vector<int> > s);


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

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

	vector<int> min_index(n, 0);
	vector<int> max_index(n, m-1);

	vector<pair<long long, int>> increase(n);

	long long total = 0;

	forint(i, k) {
		forint(j, n) {			
			increase[j].first = x[j][min_index[j]] + x[j][max_index[j]];
			increase[j].second = j;
		}
		nth_element(increase.begin(), increase.begin() + n/2, increase.end());

		 // first half is negative
		for (int j = 0; j < n/2; j++) {		 	  
			total -= x[increase[j].second][min_index[increase[j].second]];
			s[increase[j].second][min_index[increase[j].second]] = i;
			min_index[increase[j].second]++;
		}

		 // second half is positive
		for (int j = n/2; j < n; j++) {
			total += x[increase[j].second][max_index[increase[j].second]];
			s[increase[j].second][max_index[increase[j].second]] = i;
			max_index[increase[j].second]--;
		}

		 //cerr  << total << "--" << endl;
	}

	allocate_tickets(s);

	return total;
}


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

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

	vector<int> min_index(n, k-1);
	vector<int> max_index(n, m-1);

	vector<pair<long long, int>> increase(n);

	long long total = 0;

	forint(i, k) {
		forint(j, n) {			
			increase[j].first = x[j][min_index[j]] + x[j][max_index[j]];
			increase[j].second = j;
		}
		nth_element(increase.begin(), increase.begin() + n/2, increase.end());

		for (int j = n/2; j < n; j++) {
			max_index[increase[j].second]--;
			min_index[increase[j].second]--;
		}
	}


	forint(i, k) {
		forint(j, n) {			
			increase[j].first = max_index[j];
			increase[j].second = j;
		}
		nth_element(increase.begin(), increase.begin() + n/2, increase.end());

		for (int j = 0; j < n/2; j++) {		 	  
			max_index[increase[j].second]++;
			total += x[increase[j].second][max_index[increase[j].second]];
			s[increase[j].second][max_index[increase[j].second]] = i;
		}
		
		for (int j = n/2; j < n; j++) {
			total -= x[increase[j].second][min_index[increase[j].second]];
			s[increase[j].second][min_index[increase[j].second]] = i;
			min_index[increase[j].second]--;
		}
	}


	allocate_tickets(s);

	return total;
}

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