Submission #1225824

#TimeUsernameProblemLanguageResultExecution timeMemory
1225824The_SamuraiCarnival Tickets (IOI20_tickets)C++17
62 / 100
3094 ms82512 KiB
#include "tickets.h"
#include "bits/stdc++.h"
using namespace std;
using ll = long long;
const ll inf = 1e18;

long long find_maximum(int k, std::vector<std::vector<int>> a) {
	int n = a.size();
	int m = a[0].size();
	vector<int> pos(n);
	vector vec(n, vector(m, -1));
	ll ans = 0;
	for (int i = 0; i < n; i++) for (int j = m - k; j < m; j++) ans += a[i][j];
	priority_queue<pair<ll, int>> pq;
	for (int i = 0; i < n; i++) pq.emplace(-a[i][0] - a[i][m - k], i);
	for (int shit = 0; shit < n * k / 2; shit++) {
		auto [d, i] = pq.top(); pq.pop();
		ans += d;
		pos[i]++;
		if (pos[i] < k) pq.emplace(-a[i][pos[i]] - a[i][m - (k - pos[i])], i);
	}
	vector<tuple<int, int, int>> right;
	vector<vector<int>> left(n);
	vector<int> taken(n);
	vector<pair<int, int>> have(n);
	for (int i = 0; i < n; i++) {
		vector<int> v;
		for (int j = 0; j < pos[i]; j++) v.emplace_back(a[i][j]);
		for (int j = m - (k - pos[i]); j < m; j++) right.emplace_back(a[i][j], i, j);
		left[i] = v;
		have[i] = make_pair(pos[i], i);
	}
	sort(right.begin(), right.end());
	for (int shit = 0; shit < k; shit++) {
		sort(have.rbegin(), have.rend());
		vector<bool> used(n);
		vector<int> v;
		int cnt = 0;
		for (int i = 0; i < n / 2; i++) {
			used[have[i].second] = true;
			have[i].first--;
			v.emplace_back(a[have[i].second][taken[have[i].second]]);
			vec[have[i].second][taken[have[i].second]++] = shit;
		}
		vector<tuple<int, int, int>> nw;
		cnt = 0;
		for (auto [x, i, j]: right) {
			if (used[i] or cnt == n / 2 or v[cnt] > x) {
				nw.emplace_back(x, i, j);
				continue;
			}
			vec[i][j] = shit;
			used[i] = true;
			cnt++;
		}
		right = nw; nw.clear();
		assert(cnt == n / 2);
	}
	allocate_tickets(vec);
	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...