Submission #418848

#TimeUsernameProblemLanguageResultExecution timeMemory
418848Mamnoon_Siam카니발 티켓 (IOI20_tickets)C++17
25 / 100
1193 ms82212 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...