# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1017828 | nickolasarapidis | Carnival Tickets (IOI20_tickets) | C++17 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
/*
IOI 2020
Day 1 - problem 3 (tickets)
Author: Nickolas Arapidis
*/
#include "tickets.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define F first
#define S second
#define make_pair MP
ll calculate_score(vector<int> A){
int N = A.size();
ll sum = 0;
int mid = A[N/2];
for(int i = 0; i < N; i++){
sum += abs(A[i] - mid);
}
return sum;
}
ll find_maximum(int k, vector<vector<int>> X){
ll ans = 0;
int N = X.size(); // Ammount of colors
int M = X[0].size(); // Ammount of tickets for each color
vector<int> s(M, -1);
vector<vector<int>> S(N, s);
vector<int> large;
vector<int> small;
vector<int> A;
vector<pair<int, int> > B(N, {0, 0});
for(int i = 0; i < k; i++){
large.clear();
small.clear();
A.clear();
map<int, pair<int, int> > l;
map<int, pair<int, int> > s;
for(int j = 0; j < N; j++){
large.push_back(X[j][(M - 1) - B[j].S]);
small.push_back(X[j][0 + B[j].F]);
l[large.back()] = MP(j, (M - 1) - B[j].S);
s[small.back()] = MP(j, 0 + B[j].F);
}
sort(large.begin(), large.end());
sort(small.begin(), small.end());
for(int j = 0; j < N/2; j++){
A.push_back(small[j]);
S[s[A.back()].first][s[A.back()].second] = i;
}
for(int j = N/2; j < N; j++){
A.push_back(large[j]);
S[l[A.back()].first][l[A.back()].second] = i;
}
ans += calculate_score(A);
}
allocate_tickets(S);
return ans;
}