Submission #522850

#TimeUsernameProblemLanguageResultExecution timeMemory
522850jamezzzCarnival Tickets (IOI20_tickets)C++17
25 / 100
923 ms104980 KiB
#include "tickets.h"
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int,int> ii;
#define fi first
#define se second
#define pb push_back
#define sz(x) (int)x.size()
#define all(x) x.begin(),x.end()

ll find_maximum(int k,vector<vector<int>> x){
	int n=x.size();
	int m=x[0].size();
	assert(m==k);
	
	vector<vector<int>> answer(n);
	for(int i=0;i<n;++i)answer[i].resize(m,-1);
	
	vector<ii> v;
	for(int i=0;i<n;++i){
		for(int j=0;j<m;++j){
			v.pb({x[i][j],i*m+j});
		}
	}
	
	vector<int> pos;
	vector<vector<int>> neg(n);
	vector<vector<int>> in(m);
	for(int i=0;i<m;++i)in[i].resize(n,0);
	
	ll mx=0;
	sort(all(v));
	for(int i=0;i<n*m;++i){
		ii pr=v[i];
		if(i<n*m/2)mx-=pr.fi,neg[pr.se/m].pb(pr.se%m);
		else mx+=pr.fi,pos.pb(pr.se);
	}
	sort(all(pos));
	for(int i=0;i<n*m/2;++i){
		answer[pos[i]/m][pos[i]%m]=i%m;
		in[i%m][pos[i]/m]=1;
	}
	
	for(int i=0;i<m;++i){
		for(int j=0;j<n;++j){
			if(!in[i][j]){
				int x=neg[j].back();
				neg[j].pop_back();
				answer[j][x]=i;
			}
		}
	}
	
	allocate_tickets(answer);
	return mx;
}
#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...