#include "tickets.h"
#include <bits/stdc++.h>
using namespace std;
#define all(x) x.begin(), x.end()
long long find_maximum(int k, vector<vector<int>> x) {
int n = x.size();
int m = x[0].size();
vector<vector<int>> answer(n, vector<int>(m, -1));
vector<array<int, 3>> fnd(n * m);
for (int i = 0; i < n * m; i++){
fnd[i][0] = x[i / m][i % m];
fnd[i][1] = i / m;
fnd[i][2] = i % m;
}
if (m > k){
sort(all(fnd));
int ort = fnd[n * m / 2][0];
vector<vector<array<int, 5>>> colorind(n, vector<array<int, 5>>(k));
vector<int> indd(n);
for (int i = 0; i < n * m; i++){
if (indd[fnd[i][1]] < k){
colorind[fnd[i][1]][indd[fnd[i][1]]][0] = ort - fnd[i][0];
colorind[fnd[i][1]][indd[fnd[i][1]]][1] = fnd[i][2];
colorind[fnd[i][1]][indd[fnd[i][1]]][3] = fnd[i][0];
indd[fnd[i][1]]++;
}
}
for (int i = n * m - 1; i > 0; i--){
if (indd[fnd[i][1]] > 0){
indd[fnd[i][1]]--;
colorind[fnd[i][1]][indd[fnd[i][1]]][0] -= fnd[i][0] - ort;
colorind[fnd[i][1]][indd[fnd[i][1]]][2] = fnd[i][2];
colorind[fnd[i][1]][indd[fnd[i][1]]][4] = fnd[i][0];
}
}
priority_queue<array<int, 2>> pque;
for (int i = 0; i < n; i++){
pque.push({ colorind[i][0][0], i });
}
for (int i = 0; i < n * k / 2; i++){
auto f = pque.top();
pque.pop();
indd[f[1]]++;
if (indd[f[1]] < k){
pque.push({ colorind[f[1]][indd[f[1]]][0], f[1] });
}
}
fnd.clear();
for (int i = 0; i < n; i++){
for (int j = 0; j < indd[i]; j++){
fnd.push_back({ colorind[i][j][3], i, colorind[i][j][1] });
}
for (int j = indd[i]; j < k; j++){
fnd.push_back({ colorind[i][j][4], i, colorind[i][j][2] });
}
}
}
sort(all(fnd));
long long ret = 0;
for (int i = 0; i < n * k / 2; i++){
ret -= fnd[i][0];
}
for (int i = n * k / 2; i < n * k; i++){
ret += fnd[i][0];
}
priority_queue<array<int, 2>> lft, rgt;
vector<vector<int>> lftsay(n), rgtsay(n);
for (int i = 0; i < fnd.size() / 2; i++){
lftsay[fnd[i][1]].push_back(fnd[i][2]);
}
for (int i = fnd.size() / 2; i < fnd.size(); i++){
rgtsay[fnd[i][1]].push_back(fnd[i][2]);
}
for (int i = 0; i < n; i++){
lft.push({ lftsay[i].size(), i });
}
for (int i = 0; i < n; i++){
rgt.push({ rgtsay[i].size(), i });
}
stack<array<int, 2>> usedl, usedr;
vector<int> used(n);
int ul, ur;
for (int t = 0; t < min(m, k); t++){
fill(all(used), 0);
ul = 0;
ur = 0;
for (int r = 0; r < n; r++){
while (lft.size() && used[lft.top()[1]]){
usedl.push(lft.top());
lft.pop();
}
while (rgt.size() && used[rgt.top()[1]]){
usedr.push(rgt.top());
rgt.pop();
}
if (ul == n / 2){
auto f = rgt.top();
answer[f[1]][rgtsay[f[1]].back()] = t;
rgtsay[f[1]].pop_back();
used[f[1]] = 1;
if (f[0] > 1){
usedr.push({ f[0] - 1, f[1] });
}
rgt.pop();
continue;
}
if (ur == n / 2){
auto f = lft.top();
answer[f[1]][lftsay[f[1]].back()] = t;
lftsay[f[1]].pop_back();
used[f[1]] = 1;
if (f[0] > 1){
usedr.push({ f[0] - 1, f[1] });
}
lft.pop();
continue;
}
if (lft.top()[0] > rgt.top()[0]){
auto f = lft.top();
answer[f[1]][lftsay[f[1]].back()] = t;
lftsay[f[1]].pop_back();
used[f[1]] = 1;
if (f[0] > 1){
usedr.push({ f[0] - 1, f[1] });
}
lft.pop();
ul++;
}else{
auto f = rgt.top();
answer[f[1]][rgtsay[f[1]].back()] = t;
rgtsay[f[1]].pop_back();
used[f[1]] = 1;
if (f[0] > 1){
usedr.push({ f[0] - 1, f[1] });
}
rgt.pop();
ur++;
}
}
}
allocate_tickets(answer);
return ret;
}
컴파일 시 표준 에러 (stderr) 메시지
tickets.cpp: In function 'long long int find_maximum(int, std::vector<std::vector<int> >)':
tickets.cpp:79:42: warning: narrowing conversion of '(& lftsay.std::vector<std::vector<int> >::operator[](((std::vector<std::vector<int> >::size_type)i)))->std::vector<int>::size()' from 'std::vector<int>::size_type' {aka 'long unsigned int'} to 'int' [-Wnarrowing]
79 | lft.push({ lftsay[i].size(), i });
| ~~~~~~~~~~~~~~^~
tickets.cpp:82:42: warning: narrowing conversion of '(& rgtsay.std::vector<std::vector<int> >::operator[](((std::vector<std::vector<int> >::size_type)i)))->std::vector<int>::size()' from 'std::vector<int>::size_type' {aka 'long unsigned int'} to 'int' [-Wnarrowing]
82 | rgt.push({ rgtsay[i].size(), i });
| ~~~~~~~~~~~~~~^~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |