제출 #1167367

#제출 시각아이디문제언어결과실행 시간메모리
1167367gyg카니발 티켓 (IOI20_tickets)C++20
27 / 100
337 ms97272 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, b;

arr<int, N> lst, mst;
void prp_cmp() {
	for (int i = 1; i <= n; i++) {
		lst[i] = INF, mst[i] = -1;
		for (int j = 1; j <= m; j++)
			if (!b[i][j]) lst[i] = min(lst[i], a[i][j]), mst[i] = max(mst[i], a[i][j]);

		// cout << i << ": " << lst[i] << " " << mst[i] << '\n';
	}
}

arr<arr<pii, N>, N> dp;
void dp_cmp() {
	dp[0].fill({-INF, -1});
	dp[0][0] = {0, -1};
	for (int i = 1; i <= n; i++) {
		for (int c = 0; c <= n / 2; c++) {
			int tk = (c == 0) ? -INF : dp[i - 1][c - 1].fir + mst[i];
			int lv = dp[i - 1][c].fir - lst[i];
			dp[i][c] = max(mp(tk, 1), mp(lv, 0));
		}
	}
}

arr<int, N> dr;
void dr_cmp() {
	int i = n, c = n / 2;
	while (i != 0) {
		dr[i] = dp[i][c].sec;
		if (dr[i] == 0) i--;
		else i--, c--;
	}
}

void upd(int x) {
	for (int i = 1; i <= n; i++) {
		int mn = -1, mx = -1;
		for (int j = 1; j <= m; j++) {
			if (b[i][j]) continue;
			if (a[i][j] == lst[i]) mn = j;
			if (a[i][j] == mst[i]) mx = j;
		}
		if (dr[i] == 0) b[i][mn] = x;
		else b[i][mx] = x; 
	}
}

// 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];

	int ans = 0;
	for (int x = 1; x <= k; x++) {
		prp_cmp();
		dp_cmp();
		dr_cmp();
		upd(x);
		ans += dp[n][n / 2].fir;
	}

	vec<vec<sig>> ass;
	for (int i = 1; i <= n; i++) {
		vec<sig> x;
		for (int j = 1; j <= m; j++) x.push_back(b[i][j] - 1);
		ass.push_back(x);
	}
	allocate_tickets(ass);
	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...