Submission #391048

#TimeUsernameProblemLanguageResultExecution timeMemory
391048wind_reaperCarnival Tickets (IOI20_tickets)C++17
0 / 100
1 ms332 KiB
#include <bits/stdc++.h>
#ifndef LOCAL
#include "tickets.h"
#endif

using namespace std;

#ifdef LOCAL
void allocate_tickets(vector<vector<int>> ans){
	int n = ans.size(), m = ans[0].size();
	for(int i = 0; i < n; i++){
		for(int j = 0; j < m; j++)
			cout << ans[i][j] << ' ';
		cout << '\n';
	}
}
#endif

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

	int64_t a = 0;

	priority_queue<array<int64_t, 4>> pq;
	vector<vector<int>> ans(n, vector<int>(m, -1));

	vector<priority_queue<int>> maximum_in_row(n);
	vector< priority_queue<int, vector<int>, greater<int>> > minimum_in_row(n);

	for(int i = 0; i < n; i++){
		for(int j = 0; j < k; j++){
			a -= int64_t(x[i][j]);
			ans[i][j] = j;
			minimum_in_row[i].push(j);
		}
		for(int j = m-1; j >= k; --j)
			maximum_in_row[i].push(j);

		pq.push({int64_t(x[i][k-1] + x[i][m-1]), i, k-1, m-1});
	}

	for(int i = 0; i < n*k / 2; i++){
		auto [delta, row, remove, add] = pq.top();
		pq.pop();
		maximum_in_row[i].pop();
		minimum_in_row[i].pop();
		maximum_in_row[i].push(remove);
		minimum_in_row[i].push(add);

		ans[row][add] = ans[row][remove];
		ans[row][remove] = -1;

		a += int64_t(delta);

		int nxtmin = minimum_in_row[row].top(), nxtmax = maximum_in_row[row].top();

		pq.push({x[row][nxtmin] + x[row][nxtmax], row, nxtmin, nxtmax});
	}

	allocate_tickets(ans);
	return a;
}

#ifdef LOCAL

int main(){
	int n, m, k;
	cin >> n >> m >> k;

	vector<vector<int>> x(n, vector<int>(m));
	for(int i = 0; i < n; i++)
		for(int j = 0; j < m; j++)
			cin >> x[i][j];

	cout << find_maximum(k, x) << '\n';
}
#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...