Submission #540634

#TimeUsernameProblemLanguageResultExecution timeMemory
540634MilosMilutinovicCarnival Tickets (IOI20_tickets)C++14
27 / 100
571 ms73224 KiB
#include "tickets.h"
#include <bits/stdc++.h>

using namespace std;

/*
at every round we choose n / 2 mins and n / 2 maxs
value of round is sum_of_maxs - sum_of_mins
mx[i] + mn[i] > mx[j] + mn[j]
*/

long long find_maximum(int k, vector<vector<int>> x) {
  int n = x.size(), m = x[0].size();
  vector<int> l(n), r(n);
  for (int i = 0; i < n; i++) {
    l[i] = 0;
    r[i] = m - 1;
  }
  vector<vector<int>> ans(n, vector<int>(m, -1));
  long long sum = 0;
  for (int id = 0; id < k; id++) {
    vector<int> order(n);
    iota(order.begin(), order.end(), 0);
    sort(order.begin(), order.end(), [&](int i, int j) {
      return x[i][l[i]] + x[i][r[i]] > x[j][l[j]] + x[j][r[j]];
    });      
    for (int i = 0; i < n; i++) {
      if (i < n / 2) {
        sum += x[order[i]][r[order[i]]];
        ans[order[i]][r[order[i]]] = id;
        r[order[i]]--;
      } else {
        sum -= x[order[i]][l[order[i]]];
        ans[order[i]][l[order[i]]] = id;
        l[order[i]]++;
      }
    }
  }
  allocate_tickets(ans);
  return sum;
}
#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...