Submission #604112

#TimeUsernameProblemLanguageResultExecution timeMemory
604112TigryonochekkCarnival Tickets (IOI20_tickets)C++17
0 / 100
1 ms340 KiB
#include <iostream>
#include <algorithm>
#include "tickets.h"
#include <vector>
#define ll long long
using namespace std;
const ll inf = 1e18 + 69;
#define pii pair<int, int>

vector<vector<int>> answer;
ll ans;

vector<pii> wtf[1502];

long long find_maximum(int k, vector<vector<int>> x) {
	int n = x.size();
	int m = x[0].size();
	answer.resize(n);
	for (int i = 0; i < n; i++) {
		answer[i].resize(m, -1);
	}
	if (k == 1) {
		vector<pii> d(n);
		for (int i = 0; i < n; i++) {
			d[i] = pii(x[i][m - 1] + x[i][0], i);
			ans += x[i][m - 1];
		}
		sort(d.begin(), d.end());
		vector<int> v(n);
		for (int i = 0; i < n / 2; i++) {
			int ind = d[i].second;
			answer[ind][0] = 0;
			ans -= d[i].first;
		}
		for (int i = n / 2; i < n; i++) {
			int ind = d[i].second;
			answer[ind][m - 1] = 0;
		}
	}
	else if (k == m) {
		vector<pii> all;
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				all.push_back(pii(x[i][j], i * m + j));
			}
		}
		sort(all.begin(), all.end());
		for (int i = n * m / 2; i < n * m; i++) {
			ans += all[i].first;
		}
		for (int i = 0; i < n * m / 2; i++) {
			ans -= all[i].first;
		}
		pii mid = all[n + m / 2];
		vector<int> ty(n); // -1 ++, -2 --, tver@ +- u vortex a sksvum +
		int a = 0, b = 0;
		vector<int> pm;
		
		for (int i = 0; i < n; i++) {
			if (pii(x[i][0], i * m) >= mid) {
				ty[i] = -1;
				a++;
			}
			else if (pii(x[i][m - 1], i * m + m - 1) < mid) {
				ty[i] = -2;
				b++;
			}
			else {
				for (int j = 0; j < m; j++) {
					wtf[i].push_back(pii(x[i][j], i * m + j));
				}
				ty[i] = lower_bound(wtf[i].begin(), wtf[i].end(), mid) - wtf[i].begin();
				pm.push_back(i);
			}
		}
		for (int i = 0; i < n; i++) {
			if (ty[i] < 0) {
				for (int j = 0; j < m; j++) {
					answer[i][j] = j;
				}
			}
		}
		vector<int> zn(n), zv(n);
		fill(zv.begin(), zv.end(), m - 1);
		for (int j = 0; j < m; j++) {
			int aa = n / 2 - a, bb = n / 2 - b;
			for (int i = 0; i < n; i++) {
				if (ty[i] < 0) continue;
				if (zn[i] < ty[i] && aa) {
					answer[i][zn[i]] = j;
					zn[i]++;
					aa--;
				}
				else {
					answer[i][zv[i]] = j;
					zv[i]--;
					bb--;
				}
			}
		}
	}
	allocate_tickets(answer);
	return 69420;
}

/*
2 3 2 
0 2 5 
1 1 3 
*/
#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...