Submission #1167385

#TimeUsernameProblemLanguageResultExecution timeMemory
1167385gygCarnival Tickets (IOI20_tickets)C++20
14 / 100
377 ms107032 KiB
#include "tickets.h"
#include <bits/stdc++.h>
using namespace std;
#define int long long 
#define sig signed 
#define arr array 
#define vec vector 
#define pii pair<int, int>
#define fir first 
#define sec second
#define mp make_pair
const int N = 1505, M = 1505, INF = 1e18;

int n, m, k;
arr<arr<int, M>, N> a;

arr<int, N> zr, on;
void intl() {
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			if (a[i][j] == 0) zr[i]++;
			else on[i]++;
		}
	}
}

arr<arr<vec<int>, 2>, N> upd;
int upd_cmp() {
	int ans = 0;
	for (int r = 1; r <= k; r++) {
		vec<pii> ord;
		for (int i = 1; i <= n; i++) ord.push_back({on[i], i});
		sort(ord.begin(), ord.end());

		for (int i = 1; i <= n; i++) {
			pii x = ord[i - 1];
			if (on[x.sec] == 0 || (zr[x.sec] != 0 && i <= n / 2)) {
				zr[x.sec]--;
				upd[x.sec][0].push_back(r);
			} else {
				on[x.sec]--;
				upd[x.sec][1].push_back(r);
				ans += (i <= n / 2) ? -1 : +1;
			}
		}
	}
	return ans;
}

arr<arr<int, M>, N> ass;
void ass_cmp() {
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			if (a[i][j] == 0 && upd[i][0].size())
				ass[i][j] = upd[i][0].back(), upd[i][0].pop_back();
			if (a[i][j] == 1 && upd[i][1].size())
				ass[i][j] = upd[i][1].back(), upd[i][1].pop_back(); 
		}
	}
}


// Return indices 0-indexed
int find_maximum(sig _k, vec<vec<sig>> _a) {
	n = _a.size(), m = _a[0].size(), k = _k;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			a[i][j] = _a[i - 1][j - 1];

	intl();
	int ans = upd_cmp();
	// for (int i = 1; i <= n; i++) {
	// 	for (int j : upd[i][0]) cout << i << " 0 " << j << '\n';
	// 	for (int j : upd[i][1]) cout << i << " 1 " << j << '\n';
	// }
	ass_cmp();
	
	vec<vec<sig>> x;
	for (int i = 1; i <= n; i++) {
		vec<sig> y;
		for (int j = 1; j <= m; j++) y.push_back(ass[i][j] - 1);
		x.push_back(y);
	}
	allocate_tickets(x);
	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...