Submission #1221587

#TimeUsernameProblemLanguageResultExecution timeMemory
1221587MalixCarnival Tickets (IOI20_tickets)C++20
100 / 100
1456 ms168708 KiB
#include "tickets.h"
#include <bits/stdc++.h>
using namespace std;
 
typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vii;
typedef pair<int,int> pi;
typedef vector<pi> pii;
typedef tuple<int,int,int> ti;
typedef vector<ll> li;
typedef vector<li> lii;
 
#define REP(i,a,b) for(int i=a;i<b;i++)
#define F first
#define S second
#define PB push_back
#define LSOne(s) ((s)&(-s))
#define all(x) x.begin(),x.end()
 
ll INF=1000000000000000010;
int inf=1e9+10;
ll M=1e9+7;

long long find_maximum(int k, std::vector<std::vector<int>> X) {
	int n = X.size();
	int m = X[0].size();
	vii a(n,vi(m,-1));
	int x=k*n;
	ll ans=0;
	vi cnt(n,0);
	priority_queue<pair<ll,int>> pq;
	vector<vector<pi>> arr(n);
	REP(i,0,n)REP(j,0,m)arr[i].PB({X[i][j],j});
	REP(i,0,n)sort(all(arr[i]));
	REP(i,0,n)REP(j,0,k){
		ans-=arr[i][j].F;
		pq.push({(ll)arr[i][j].F+(ll)arr[i][m-k+j].F,i});
	}
	REP(i,0,x/2){
		auto [y,z]=pq.top();
		pq.pop();
		ans+=y;
		cnt[z]++;
	}
	vii mx(n),mn(n);
	REP(i,0,n){
		REP(j,0,cnt[i])mx[i].PB(arr[i][m-1-j].S);
		REP(j,0,k-cnt[i])mn[i].PB(arr[i][j].S);
	}	
	vector<set<int>> st(n);
	REP(i,0,k){
		priority_queue<pi> p;
		REP(j,0,n)if(cnt[j])p.push({cnt[j],j});
		REP(j,0,n/2){
			int y=p.top().S;
			p.pop();
			cnt[y]--;
			a[y][mx[y].back()]=i;
			st[y].insert(i);
			mx[y].pop_back();
		}
	}
	REP(i,0,n){
		int ps=0;
		for(auto u:mn[i]){
			while(st[i].count(ps))ps++;
			a[i][u]=ps++;
		}
	}
	allocate_tickets(a);
	return ans;
}
#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...