# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1024144 | TheWilp | 카니발 티켓 (IOI20_tickets) | C++14 | 2 ms | 860 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "tickets.h"
#include <vector>
#include <algorithm>
using ll = long long;
class name {
public:
int value;
int i,j;
bool operator<(const name& other) const {
return value < other.value;
}
};
class name2{
public:
int value;
int i;
bool operator<(const name2& other)const{
return value < other.value;
}
};
long long find_maximum(int k, std::vector<std::vector<int>> x) {
int N = x.size();
int M = x[0].size();
std::vector<std::vector<int>> ans(N,std::vector<int>(M,-1));
std::vector<int> group(N,0);
std::vector<std::vector<int>> round(k);
std::vector<name> s;
std::vector<std::vector<name2>> ss(N);
for(int q = 0;q < N;q++) {
for(int w = 0;w < M;w++) {
name n;
n.value = x[q][w];
n.i = q;
n.j = w;
s.push_back(n);
name2 n2;
n2.value = x[q][w];
n2.i = w;
ss[q].push_back(n2);
}
}
std::sort(s.begin(),s.end());
for(int q = 0;q < N;q++) std::sort(ss[q].begin(),ss[q].end());
int i = s.size() - 1;
int t = 0;
std::vector<std::vector<name>> upper(N);
while(i >= 0 && t < k * N / 2) {
name e = s[i--];
if(group[e.i] >= k) continue;
upper[e.i].push_back(e);
group[e.i]++;
t++;
}
i = 0;
t = 0;
std::vector<std::vector<name>> lower(N);
for(int q = 0;q < N;q++) {
int count1 = 0;
while(group[q] < k) {
name n;
n.i = q;
n.j = ss[q][count1++].i;
n.value = x[q][group[q]++];
lower[q].push_back(n);
}
}
int r = 0;
int j = 0;
std::vector<int> start_pos(N);
while(j < upper.size()) {
for(int q = 0;q < upper[j].size();q++) {
round[r].push_back(upper[j][q].value);
ans[upper[j][q].i][upper[j][q].j] = r;
++r;
r%=k;
}
start_pos[j] = r;
++j;
}
r = 0;
j = 0;
while(j < lower.size()) {
r = start_pos[j];
for(int q = 0;q < lower[j].size();q++) {
round[r].push_back(lower[j][q].value);
ans[lower[j][q].i][lower[j][q].j] = r;
++r;
r%=k;
}
++j;
}
ll res = 0;
for(int q = 0;q < k;q++) {
std::sort(round[q].begin(),round[q].end());
for(int w = 0;w < N / 2;w++) {
res -= round[q][w];
}
for(int w = N / 2;w < N;w++) {
res += round[q][w];
}
}
allocate_tickets(ans);
return res;
}
컴파일 시 표준 에러 (stderr) 메시지
# | 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... |