제출 #303310

#제출 시각아이디문제언어결과실행 시간메모리
303310Utaha카니발 티켓 (IOI20_tickets)C++14
100 / 100
1274 ms84492 KiB
#include "tickets.h"
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
#define F first 
#define S second
#define ALL(a) a.begin(),a.end()
#define MP make_pair
#define pb push_back
#define eb emplace_back
#define SZ(a) ((int)a.size())
#define REP(i,n) for(int i=0;i<(n);i++)

const int maxn = 1505;

int n,m,k;
std::vector<std::vector<int>> ans;

vector<int> idx[maxn]; //pos
vector<int> idx2[maxn]; //neg

set<pii> st;
void distribute(){//distrubute all tickets in idx[] to k rounds, each round with n/2 distinct color
	REP(i,n){
		st.insert(MP(SZ(idx[i]),i));
	}

	REP(i,k){
		auto it = prev(st.end());
		vector<int> clr={};
		bool vis[maxn]={0};
		REP(j,n/2){
			clr.pb(it->S);
			--it;
		}
		for(int j:clr){
			vis[j] = 1;
			ans[j][idx[j].back()] = i;
			st.erase(MP(SZ(idx[j]),j));
			idx[j].pop_back();
			st.insert(MP(SZ(idx[j]),j));
		}
		REP(j,n) if(!vis[j]){
			ans[j][idx2[j].back()] = i;
			idx2[j].pop_back();
		}
	}
}

// bool check(vector<int> v){
// 	assert(SZ(v)==n);
// 	sort(ALL(v));
// 	reverse(ALL(v));
// 	int sum = 0;
// 	REP(i,SZ(v)){
// 		sum+=v[i];
// 		if(sum>(i+1) * k) return 0;
// 	}
// 	return 1;
// }

ll val[maxn][maxn];

priority_queue<pll> pq;
int iter[maxn];

long long find_maximum(int _k, std::vector<std::vector<int>> a) {
	n = a.size();
	m = a[0].size();
	k=_k;
	ans.resize(n);
	REP(i,n) ans[i].resize(m);
	REP(i,n) REP(j,m) ans[i][j]=-1;

	ll ret = 0;
	
	REP(i,n){
		REP(j,k) ret -= a[i][j];
		REP(j,k){
			val[i][j] = a[i][m-1-j] + a[i][k-1-j];
		}
	}
	REP(i,n) iter[i] = 0;

	REP(i,n) pq.push(MP(val[i][0],i));

	REP(T,n*k/2){
		auto cur = pq.top();
		pq.pop();
		int idx = cur.S;

		ret += cur.F;

		iter[idx]++;

		if(iter[idx]==k) continue;
		pq.push(MP(val[idx][iter[idx]],idx));
	}

	// REP(i,n) cout<<iter[i]<<" \n"[i==n-1];

	{
		REP(i,n){
			REP(j,k-iter[i])
				idx2[i].pb(j);

			REP(j,iter[i])
				idx[i].pb(m-1-j);
		}
		// REP(i,n) {
			// for(int j:idx[i]) cout<<j<<' ';
			// cout<<'\n';
		// }

		distribute();
	}

	allocate_tickets(ans);
	return ret;
}
#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...