Submission #425167

# Submission time Handle Problem Language Result Execution time Memory
425167 2021-06-12T14:26:07 Z Mlxa Carnival Tickets (IOI20_tickets) C++14
11 / 100
3000 ms 4316 KB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define all(x) x.begin(), x.end()
#define mp make_pair
#define mt make_tuple
#define x first
#define y second
#include "tickets.h"
#include <vector>

ll estimate(vector<vector<int>> answer, const vector<vector<int>> &x, int k) {
	int n = (int)answer.size(), m = (int)answer[0].size();
	vector<vector<int>> res(k);
	for (int i = 0; i < n; ++i) {
		for (int j = 0; j < m; ++j) {
			// cout << answer[i][j] << " ";
			if (answer[i][j] != -1) {
				res[answer[i][j]].push_back(x[i][j]);
			}
		}
		// cout << endl;
	}
	ll sum = 0;
	for (int i = 0; i < k; ++i) {
		sort(all(res[i]));
		assert((int)res[i].size() == n);
		for (int j = 0; j < n / 2; ++j) {
			sum += res[i][n - 1 - j] - res[i][j];
		}
	}
	return sum;
}

const int N = 2000;
int cnt[N], lef[N], rig[N];

vector<vector<int>> query(int cut, int k, vector<vector<int>> zip) {
	int n = (int)zip.size(), m = (int)zip[0].size();
	vector<vector<int>> answer(n, vector<int>(m, -1));
	int ones = 0;
	for (int i = 0; i < n; ++i) {
		for (int j = 0; j < m; ++j) {
			cnt[i] += zip[i][j] >= cut;
			ones += zip[i][j] >= cut;
		}
	}
	fill_n(lef, n, 0);
	fill_n(rig, n, m - 1);

	vector<int> rows(n);
	iota(all(rows), 0);
	for (int i = 0; i < k; ++i) {
		sort(all(rows), [&](int ii, int jj) {
			return cnt[ii] < cnt[jj];
		});
		// cout << "--- " << i << endl;
		for (int j = 0; j < n / 2; ++j) {
			int sj = j;
			j = rows[j];
			// cout << "lef " << j << endl;
			cnt[j] -= zip[j][lef[j]] >= cut;
			answer[j][lef[j]++] = i;
			j = sj;
		}
		for (int j = n / 2; j < n; ++j) {
			int sj = j;
			j = rows[j];
			// cout << "rig " << j << endl;
			cnt[j] -= zip[j][rig[j]] >= cut;
			answer[j][rig[j]--] = i;
			j = sj;
		}
	}
	return answer;
}

ll find_maximum(int k, vector<vector<int>> x) {
	int n = (int)x.size();
	int m = (int)x[0].size();
	vector<pair<int, pair<int, int>>> order;
	vector<vector<int>> zip(n, vector<int>(m));
	for (int i = 0; i < n; ++i) {
		for (int j = 0; j < m; ++j) {
			order.emplace_back(x[i][j], mp(i, j));
		}
	}
	sort(all(order));
	for (int i = 0; i < (int)order.size(); ++i) {
		auto e = order[i].y;
		zip[e.x][e.y] = i;
	}
	
	vector<vector<int>> answer = query(0, k, zip);
	ll sum = estimate(answer, x, k);
	for (int i = 0; i <= n * m; ++i) {
		auto cur = query(i, k, zip);
		ll tmp = estimate(cur, x, k);
		if (sum < tmp) {
			sum = tmp;
			answer = cur;
		}
	}
	allocate_tickets(answer);
	return sum;
}

#ifdef LC
#include "grader.cpp"
#endif
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 0 ms 204 KB Output is correct
3 Correct 0 ms 204 KB Output is correct
4 Correct 2 ms 204 KB Output is correct
5 Correct 21 ms 404 KB Output is correct
6 Correct 592 ms 824 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 204 KB Output is correct
2 Incorrect 1 ms 204 KB Contestant returned 2543298744 while correct return value is 2727881086.
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 0 ms 204 KB Output is correct
3 Correct 1 ms 204 KB Output is correct
4 Correct 1207 ms 588 KB Output is correct
5 Execution timed out 3099 ms 3872 KB Time limit exceeded
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 0 ms 204 KB Output is correct
3 Correct 1 ms 204 KB Output is correct
4 Correct 2879 ms 600 KB Output is correct
5 Execution timed out 3089 ms 4316 KB Time limit exceeded
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Incorrect 243 ms 544 KB Contestant returned 39219848713 while correct return value is 39376297182.
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Incorrect 243 ms 544 KB Contestant returned 39219848713 while correct return value is 39376297182.
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 0 ms 204 KB Output is correct
3 Correct 0 ms 204 KB Output is correct
4 Correct 2 ms 204 KB Output is correct
5 Correct 21 ms 404 KB Output is correct
6 Correct 592 ms 824 KB Output is correct
7 Correct 0 ms 204 KB Output is correct
8 Incorrect 1 ms 204 KB Contestant returned 2543298744 while correct return value is 2727881086.
9 Halted 0 ms 0 KB -