Submission #1179172

#TimeUsernameProblemLanguageResultExecution timeMemory
1179172PacybwoahCarnival Tickets (IOI20_tickets)C++20
11 / 100
1 ms840 KiB
#include "tickets.h"
#include <vector>
#include<iostream>
#include<algorithm>
#include<utility>
using namespace std;
typedef long long ll;

long long find_maximum(int k, std::vector<std::vector<int>> xx) {
	int n = (int)xx.size();
	int m = (int)xx[0].size();
	vector<vector<ll>> vec(n, vector<ll>(m));
	vector<vector<int>> ans(n, vector<int>(m, -1));
	for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) vec[i][j] = xx[i][j];
	if(m == 1){
		vector<ll> srtd;
		for(int i = 0; i < n; i++) ans[i][0] = 0, srtd.push_back(vec[i][0]);
		sort(srtd.begin(), srtd.end());
		ll sum = 0;
		for(int i = 0; i < n / 2; i++) sum += srtd[n - 1 - i] - srtd[i];
		allocate_tickets(ans);
		return sum;
	}
	if(k == 1){
		ll anss = -1;
		for(int ti = 0; ti < n; ti++){
			for(int tj = 0; tj < 2; tj++){
				ll num;
				if(tj == 0) num = vec[ti][0];
				else num = vec[ti][m - 1];
				vector<int> a, b;
				vector<pair<ll, int>> ca, cb;
				ll sum = 0;
				for(int i = 0; i < n; i++){
					if(vec[i][m - 1] < num){
						a.emplace_back(i);
					}
					else if(vec[i][0] > num){
						b.emplace_back(i);
					}
					else{
						ll cl = num - vec[i][0], cr = vec[i][m - 1] - num;
						if(cl > cr){
							a.emplace_back(i);
							ca.emplace_back(cl - cr, i);
						}
						else{
							b.emplace_back(i);
							cb.emplace_back(cr - cl, i);
						}
					}
				}
				if((int)a.size() + (int)cb.size() < n / 2) continue;
				if((int)b.size() + (int)ca.size() < n / 2) continue;
				for(auto &x: a){
					sum += num - vec[x][0];
				}
				for(auto &x: b){
					sum += vec[x][m - 1] - num;
				}
				if((int)a.size() > n / 2){
					sort(ca.begin(), ca.end());
					int sz = (int)a.size();
					for(int i = 0; i < sz - n / 2; i++) sum -= ca[i].first;
				}
				if((int)b.size() > n / 2){
					sort(cb.begin(), cb.end());
					int sz = (int)b.size();
					for(int i = 0; i < sz - n / 2; i++) sum -= cb[i].first;
				}
				if(sum > anss){
					anss = sum;
					vector<int> whch(n, 1);
					if((int)a.size() <= n / 2){
						for(auto &x: a) whch[x] = 0;
						int sz = (int)a.size();
						for(int i = 0; i < n / 2 - sz; i++) whch[cb[i].second] = 0;
					}
					else{
						for(auto &x: a) whch[x] = 0;
						int sz = (int)a.size();
						for(int i = 0; i < sz - n / 2; i++) whch[ca[i].second] = 1;
					}
					for(int i = 0; i < n; i++){
						ans[i][0] = -1;
						ans[i][m - 1] = -1;
						if(whch[i] == 0) ans[i][0] = 0;
						else ans[i][1] = 0;
					}
				}
			}
		}
		allocate_tickets(ans);
		return anss;
	}
	return 1;
}
// g++ -std=c++17 -Wall -Wextra -Wshadow -fsanitize=undefined -fsanitize=address -o run -g grader.cpp tickets.cpp
#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...