This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "tickets.h"
#include <bits/stdc++.h>
using namespace std;
#define INPUT "03.in"
#ifdef LOCAL
namespace grader {
void allocate_tickets( std::vector<std::vector<int>> _d);
}
void allocate_tickets( std::vector<std::vector<int>> _d) {
grader::allocate_tickets(_d);
}
#endif
using ll = long long;
using ii = pair<int, int>;
using vi = vector<int>;
#define all(v) begin(v), end(v)
#define sz(v) (int)(v).size()
#define fi first
#define se second
long long find_maximum(int k, std::vector<std::vector<int>> x) {
int n = sz(x);
int m = sz(x[0]);
assert(k == m);
vector<ii> ord(n * m);
for(int i = 0; i < n; ++i) {
for(int j = 0; j < m; ++j) {
ord[i * m + j] = ii(i, j);
}
}
sort(all(ord), [&x](ii a, ii b) {
return x[a.fi][a.se] < x[b.fi][b.se];
});
vector<vi> neg(n), pos(n);
for(int i = 0; i < sz(ord)/2; ++i) {
neg[ord[i].fi].emplace_back(ord[i].se);
}
for(int i = sz(ord)/2; i < sz(ord); ++i) {
pos[ord[i].fi].emplace_back(ord[i].se);
}
ll total = 0;
vector<vi> ans(n, vi(m));
for(int c = 0; c < m; ++c) {
vi p(n); iota(all(p), 0);
sort(all(p), [&pos](int i, int j){ return sz(pos[i]) < sz(pos[j]); });
for(int i = 0; i < n/2; ++i) {
total -= x[p[i]][neg[p[i]].back()];
ans[p[i]][neg[p[i]].back()] = c;
neg[p[i]].pop_back();
}
for(int i = n/2; i < n; ++i) {
total += x[p[i]][pos[p[i]].back()];
ans[p[i]][pos[p[i]].back()] = c;
pos[p[i]].pop_back();
}
}
allocate_tickets(ans);
return total;
}
#ifdef LOCAL
namespace grader {
static int n;
static int m;
static int k;
static std::vector<std::vector<int>> d;
static std::vector<std::vector<int>> x;
static int called = 0;
static void check(bool cond, std::string message) {
if (!cond) {
printf("%s\n", message.c_str());
exit(0);
}
}
void allocate_tickets( std::vector<std::vector<int>> _d) {
check(!called, "allocate_tickets called more than once");
d = _d;
check((int)d.size() == n, "allocate_tickets called with parameter of wrong size");
for (int i = 0; i < n; i++) {
check((int)d[i].size() == m, "allocate_tickets called with parameter of wrong size");
}
called = 1;
}
void main() {
assert(scanf("%d %d %d", &n, &m, &k) == 3);
x.resize(n);
for (int i = 0; i < n; i++) {
x[i].resize(m);
for (int j=0; j < m; j++) {
assert(scanf("%d", &x[i][j]) == 1);
}
}
fclose(stdin);
long long answer = find_maximum(k, x);
check(called, "failure to call allocate_tickets");
printf("%lld\n", answer);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (j) printf(" ");
printf("%d", d[i][j]);
}
printf("\n");
}
fclose(stdout);
}
}
int main(int argc, char const *argv[])
{
freopen(INPUT, "r", stdin);
grader::main();
return 0;
}
#endif
# | 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... |