Submission #577998

#TimeUsernameProblemLanguageResultExecution timeMemory
577998VanillaCarnival Tickets (IOI20_tickets)C++17
11 / 100
3098 ms48620 KiB
#include <bits/stdc++.h>
#include "tickets.h"
using namespace std;

struct el {
	long long x, y, idx;

	bool operator < (const el &oth) const {
		return (x - y) < (oth.x - oth.y);
	}
};

bool comp (pair <long, long> a, pair <long, long> b) {
	return (a.first - b.second) > (b.first - b.second);
}

long long find_maximum(int k, vector<vector<int>> x) {
	long long n = x.size();
	long long m = x[0].size();
	if (m == 1){ // subtask 1
		vector<vector<int>> answer (n, vector <int> (m));
		long long rs = 0;
		vector <int> v;
		for (int i = 0; i < n; i++){
			v.push_back(x[i][0]);
		}
		sort(v.begin(), v.end());
		for (int i = 0; i < n; i++){
			rs+=abs(x[i][0] - v[n / 2]);
		}
		allocate_tickets(answer);
		return rs;
	}
	else if (k == 1) { // subtask 2
		vector<vector<int>> answer (n, vector <int> (m, -1));
		vector <int> is (n);
		long long rs = 0;
		for (int i = 0; i < n; i++){
			for (int j = 0; j < m; j++){
				vector <int> tis (n);
				tis[i] = j;
				long long trs = 0;
				int low = 0;
				vector <el > v;
				for (int k = 0; k < n; k++){
					if (i == k) continue;
					if (x[k][m-1] < x[i][j]) {
						tis[k] = 0;
						low++;
						trs+=x[i][j] - x[k][0];
					}
					else if (x[k][0] > x[i][j]) {
						tis[k] = m - 1;
						trs+=x[k][m-1] - x[i][j];
					}
					else {
						v.push_back({x[i][j] - x[k][0], x[k][m-1] - x[i][j], k});
					}
				}
				if (low >= n / 2) continue;
				sort(v.begin(), v.end());
				reverse(v.begin(), v.end());
				for (auto now: v) {
					assert(now.x >= 0 && now.y >= 0);
					if (low != n / 2 - 1) {
						trs+=now.x;
						tis[now.idx] = 0;
						low++;
					}
					else {
						trs+=now.y;
						tis[now.idx] = m - 1;
					}
				}
				if (trs > rs && low == n / 2 - 1) {
					rs = trs;
					is = tis;
				}
			}
		}
		for (int i = 0; i < n; i++){
			answer[i][is[i]] = 0;
		}
		allocate_tickets(answer);
		return rs;
	}
	else { // subtask 3
		// int n0 = 0, n1 = 0;
		// for (int i = 0; i < n; i++){
		// 	for (int j = 0; j < m; j++){
		// 		n0+=x[i][j] == 0;
		// 		n1+=x[i][j] == 1;
		// 	}
		// }
		// for (int i = 0; i < k; i++){

		// }
	}
	return -1;
}
#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...