이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
#include "tickets.h"
using namespace std;
using ll = long long;
const int inf = 1e9;
#ifdef ONPC
#define debug(args...) {cout << "[" << #args << "]: "; debug_out(args);}
#else
#define debug(args...) {42;}
#endif
void debug_out() {
cout << endl;
}
template<typename H, typename... T>
void debug_out(vector<H> h, T... t) {
cout << "{";
for (H i : h) cout << i << ", ";
cout << "}, ";
debug_out(t...);
}
template<typename H, typename... T>
void debug_out(H h, T... t) {
cout << h << ", ";
debug_out(t...);
}
long long find_maximum(int k, std::vector<std::vector<int>> x) {
int n = x.size();
int m = x[0].size();
vector<tuple<int,int,int>> pos(n);
for (int i = 0; i < n; i++)
pos[i] = {-x[i][0], x[i][m-1], i};
sort(pos.begin(), pos.end(), [&](auto a, auto b) {
return get<1>(a) - get<0>(a) > get<1>(b) - get<0>(b);
});
int space = m - k;
vector score(n, vector<ll>());
for (int i = 0; i < n; i++) {
ll cur = accumulate(x[i].begin(), x[i].end(), 0ll);
ll base = cur;
if (!space) score[i].push_back(0);
for (int j = 0; j < m; j++) {
cur -= x[i][j];
if (j >= space) {
cur += -x[i][j - space];
}
if (j >= space-1) {
ll prev = score[i].size() ? score[i].back() : cur - base;
score[i].push_back(cur - base - prev);
}
}
assert((int)score[i].size() == k + 1);
debug(i, score[i]);
}
vector<int> use(n);
constexpr ll infl = 1e18;
ll lb = -infl, rb = 1;
while (lb < rb-1) {
ll mid = (lb+ rb) / 2;
int cnt = 0;
for (int i = 0; i < n; i++)
cnt += upper_bound(score[i].begin(), score[i].end(), mid, greater()) - score[i].begin() - 1;
if (cnt >= n / 2 * k)
lb = mid;
else rb = mid;
}
ll mid = lb;
int rem = n / 2 * k;
for (int i = 0; i < n; i++) {
use[i] = lower_bound(score[i].begin(), score[i].end(), mid, greater()) - score[i].begin() - 1;
use[i] = max(0, use[i]);
rem -= use[i];
}
debug(rem, use);
assert(rem >= 0);
for (int i = 0; i < n; i++) {
auto [lb,rb] = equal_range(score[i].begin(), score[i].end(), mid);
int eq = rb - lb;
use[i] += min(eq, rem);
rem -= min(eq, rem);
}
debug(rem, use);
assert(accumulate(use.begin(), use.end(), 0) == n / 2 * k);
assert(*min_element(use.begin(), use.end()) >= 0);
vector type(n, vector<int>(m, 0));
for (int i = 0; i < n; i++) {
for (int j = 0; j < use[i]; j++)
type[i][j] = -1;
for (int j = 0; j < k - use[i]; j++)
rbegin(type[i])[j] = 1;
}
ll sum = 0;
vector ans(n, vector<int>(m, -1));
int round_low = 0;
for (int i = 0; i < n; i++) {
debug(i, ans[i]);
for (int j = 0; j < m; j++) {
if (type[i][j] == -1) {
sum -= x[i][j];
ans[i][j] = round_low++;
if (round_low >= k) round_low -= k;
}
}
int round = round_low;
for (int j = 0; j < m; j++) {
if (type[i][j] == 1) {
sum += x[i][j];
ans[i][j] = round++;
if (round >= k) round -= k;
}
}
debug(i, ans[i]);
}
allocate_tickets(ans);
return sum;
}
컴파일 시 표준 에러 (stderr) 메시지
tickets.cpp: In function 'long long int find_maximum(int, std::vector<std::vector<int> >)':
tickets.cpp:10:25: warning: statement has no effect [-Wunused-value]
10 | #define debug(args...) {42;}
| ^~
tickets.cpp:57:9: note: in expansion of macro 'debug'
57 | debug(i, score[i]);
| ^~~~~
tickets.cpp:10:25: warning: statement has no effect [-Wunused-value]
10 | #define debug(args...) {42;}
| ^~
tickets.cpp:80:5: note: in expansion of macro 'debug'
80 | debug(rem, use);
| ^~~~~
tickets.cpp:10:25: warning: statement has no effect [-Wunused-value]
10 | #define debug(args...) {42;}
| ^~
tickets.cpp:88:5: note: in expansion of macro 'debug'
88 | debug(rem, use);
| ^~~~~
tickets.cpp:10:25: warning: statement has no effect [-Wunused-value]
10 | #define debug(args...) {42;}
| ^~
tickets.cpp:104:9: note: in expansion of macro 'debug'
104 | debug(i, ans[i]);
| ^~~~~
tickets.cpp:10:25: warning: statement has no effect [-Wunused-value]
10 | #define debug(args...) {42;}
| ^~
tickets.cpp:120:9: note: in expansion of macro 'debug'
120 | debug(i, ans[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... |