Submission #1360388

#TimeUsernameProblemLanguageResultExecution timeMemory
1360388cowkimCarnival Tickets (IOI20_tickets)C++20
27 / 100
190 ms51380 KiB
#include "tickets.h"
#include <bits/stdc++.h>
using namespace std;
#define DEBUG false
#if DEBUG
void allocate_tickets(vector<vector<long long>> arr){
	for(long long j = 0; j< arr[0].size(); j++){
		for(long long i = 0; i< arr.size(); i++){
			cout << arr[i][j] << " ";
		}
		cout << endl;
	}
}
#endif
long long find_maximum(int k, std::vector<std::vector<int>> x) {
	long long n = x.size();
	long long m = x[0].size();
	vector<long long> l(n,0);
	vector<long long> r(n,m-k);
	priority_queue<pair<long long,long long>,vector<pair<long long,long long>>,greater<pair<long long,long long>>> pq;
	for(long long i = 0; i< n; i++){
		pq.push({x[i][r[i]] + x[i][l[i]],i});
	}
	long long nrunder = k*n/2;
	for(long long i = 0; i< nrunder; i++){
		long long curi = pq.top().second;
		pq.pop();
		l[curi]++;
		r[curi]++;
		if(r[curi] == m) continue;
		pq.push({x[i][r[curi]] + x[i][l[curi]],curi});
	}
	long long totprize = 0;
	for(long long i = 0; i< n; i++){
		for(long long j = 0; j< l[i]; j++){
			totprize -= x[i][j];
		}
		for(long long j = r[i]; j < m; j++){
			totprize += x[i][j];
		}
	}
	// for(long long i = 0; i< n; i++){
	// 	cout << l[i] << " ";
	// }
	// cout << endl;
	// for(long long i = 0; i< n; i++){
	// 	cout << r[i] << " ";
	// }
	// cout << endl;
	vector<vector<int>> ans(n,vector<int>(m,-1));
	long long half = n/2;
	long long forcedl = 0;
	long long forcedr = 0;
	for(long long i = 0; i< n; i++){
		if(l[i] == 0) forcedr++;
		else if(r[i] == m) forcedl++;
	}
	for(long long round = 0; round < k; round++){
		long long curl = forcedl;
		long long curr = forcedr;
		for(long long i = 0; i< n; i++){
			if(l[i] == 0) ans[i][r[i]++] = round;
			else if(r[i] == m) ans[i][--l[i]] = round;
			else if(curl < half){
				ans[i][--l[i]] = round;
				curl++;
				if(l[i] == 0) forcedr++;
			}
			else{
				ans[i][r[i]++] = round;
				curr++;
				if(r[i] == m) forcedl++;
			}
		}
	}
	allocate_tickets(ans);
	return totprize;
}
#if DEBUG
long long main(){
	long long n,m,k;
	cin >> n >> m >> k;
	vector<vector<long long>> arr(n,vector<long long>(m));
	for(auto& row : arr){
		for(auto& x : row) cin >> x;
	}
	long long ans = find_maximum(k,arr);
	cout << "! " << ans << endl;
}
#endif
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...