제출 #1348926

#제출 시각아이디문제언어결과실행 시간메모리
1348926Ludissey카니발 티켓 (IOI20_tickets)C++20
100 / 100
919 ms83904 KiB
#include "tickets.h"
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define sz(a) (int)a.size()
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
const int MAX=1e9;

long long find_maximum(signed __k, std::vector<std::vector<signed>> x) {
	int n=sz(x);
	int m=sz(x[0]);
	int k=__k;
	vector<pair<int,int>> v;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++) v.push_back({x[i][j], i});
	}
	sort(all(v));
	int cnt=0;
	int l=0;
	vector<int> sub(n);
	vector<int> last(n,0);
	int tot=0;
	while(cnt<(n/2)*k){
		if(sub[v[l].second]<k) {
			last[v[l].second]++;
			sub[v[l].second]++;
			cnt++;
			tot-=v[l].first;
		}
		l++;
	}
	for (int i=sz(v)-1; i>=0; i--)
	{
		if(sub[v[i].second]<k) {
			cnt--;
			sub[v[i].second]++;
			tot+=v[i].first;
		}
	}
	while(true&&k<m){
		int mn=1e12;
		int mx=-1e12;
		int mxI=-1;
		int mnI=-1;
		for (int i = 0; i < n; i++)
		{
			int vx=-1e12;
			int vn=1e12;
			if(last[i]>0) vx=x[i][last[i]-1]+x[i][m-(k-last[i])-1];
			if(last[i]!=k) vn=(x[i][last[i]]+x[i][m-(k-last[i])]);
			if(vx>mx){
				mxI=i;
				mx=vx;
			}
			if(vn<mn){
				mnI=i;
				mn=vn;
			}
		}
		if(mx-mn>0) {
			tot+=mx-mn;
			last[mxI]--;
			last[mnI]++;
		}else {
			break;
		}
	}
	vector<vector<signed>> ret(n,vector<signed>(m,-1));
	set<pair<int,int>> st;
	vector<int> stv(k,0);
	for (int i = 0; i < k; i++) st.insert({stv[i],i});
	for (int i = 0; i<n; i++)
	{
		vector<pair<int,int>> ins;
		for (int j = 0; j < last[i]; j++) {
			int v=(*st.rbegin()).second;
			st.erase(*st.rbegin());
			stv[v]--;
			ins.push_back({stv[v],v});
			ret[i][j]=v;
		}
		for (int j = m-(k-last[i]); j < m; j++) {
			int v=(*st.begin()).second;
			st.erase(*st.begin());
			stv[v]++;
			ins.push_back({stv[v],v});
			ret[i][j]=v;
		}
		for (int j = 0; j < k; j++) st.insert(ins[j]);
	}
	allocate_tickets(ret);
	return tot;
}
#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...