제출 #774057

#제출 시각아이디문제언어결과실행 시간메모리
774057kingfran1907Carnival Tickets (IOI20_tickets)C++14
100 / 100
731 ms94044 KiB
#include "tickets.h"
#include <bits/stdc++.h>

using namespace std;
typedef long long llint;
const int maxn = 1510;

int n, m, k;
llint pref[maxn][maxn];
int t[maxn];
int ptrl[maxn], ptrr[maxn];
bool bio[maxn];
int lef[maxn];

llint f(int x, int t) {
	return pref[x][m] - pref[x][m - t] - pref[x][k - t];
}

llint cal(int x, int t) {
	if (t == 0) return (1LL << 60);
	return f(x, t) - f(x, t - 1);
}

long long find_maximum(int K, std::vector<std::vector<int>> x) {
	n = x.size();
	m = x[0].size();
	k = K;
	
	vector< vector<int> > ans(n, vector<int>(m, -1));
	for (int i = 0; i < n; i++) 
		for (int j = 0; j < m; j++)
			pref[i][j + 1] = pref[i][j] + x[i][j];
	
	set< pair<llint, int> > s;
	for (int i = 0; i < n; i++) {
		t[i] = k;
		s.insert({cal(i, k), i});
	}
	for (int abc = 0; abc < k * n / 2; abc++) {
		auto iter = s.begin();
		int ind = iter->second;
		s.erase(iter);
		
		t[ind]--;
		s.insert({cal(ind, t[ind]), ind});
	}
	//for (int i = 0; i < n; i++) printf("%d ", t[i]);
	//printf("\n");
	
	for (int i = 0; i < n; i++) {
		lef[i] = k - t[i];
		ptrr[i] = 0, ptrr[i] = m - 1;
	}
	
	llint sol = 0;	
	int mid = n / 2;
	for (int i = 0; i < k; i++) {
		vector< pair<int, int> > v;
		for (int j = 0; j < n; j++) {
			v.push_back({lef[j], j});
		}
		sort(v.begin(), v.end());
		for (int j = 0; j < n; j++) {
			int tr = v[j].second;
			if (j >= mid) {
				//printf("removing: %d\n", tr);
				lef[tr]--;
				sol -= x[tr][ptrl[tr]];
				ans[tr][ptrl[tr]++] = i;
			} else {
				//printf("adding: %d\n", tr);
				sol += x[tr][ptrr[tr]];
				ans[tr][ptrr[tr]--] = i;
			}
		}
	}
	allocate_tickets(ans);
	return sol;
}
#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...