Submission #1212215

#TimeUsernameProblemLanguageResultExecution timeMemory
1212215kunzaZa183Boxes with souvenirs (IOI15_boxes)C++20
20 / 100
0 ms328 KiB
#include "boxes.h"

#include <bits/stdc++.h>
using namespace std;

long long delivery(int N, int K, int L, int p[]) {
  vector<int> left, right;
  int ct = 0;
  for (int i = 0; i < N; i++)
    if (L % 2 == 0 && p[i] == L / 2)
      ct++;
    else if (p[i] <= L / 2) {
      left.push_back(p[i]);
    } else
      right.push_back(p[i]);

  // cerr << left.size() << " " << right.size() << "\n";

  // cout << (left.empty() ? 0 : left.back() * 2) +
  //             (right.empty() ? 0 : (N - right.front()) * 2)
  //      << "\n";

  // return min(L, (left.empty() ? 0 : left.back() * 2) +
  //                   (right.empty() ? 0 : (L - right.front()) * 2));

  long long ans = 0;
  reverse(right.begin(), right.end());

  while (ct > 0) {
    if (left.size() % K == 0) break;
    left.push_back(L / 2);
    ct--;
  }

  while (ct > 0) {
    if (right.size() % K == 0) break;
    right.push_back(L / 2);
    ct--;
  }

  for (int i = K - 1; i < left.size(); i += K) {
    ans += 2 * left[i];
  }
  for (int i = K - 1; i < right.size(); i += K) {
    ans += 2 * (L - right[i]);
  }

  reverse(left.begin(), left.end());
  reverse(right.begin(), right.end());

  vector<int> newl, newr;
  for (int i = 0; i < left.size() % K; i++) newl.push_back(left[i]);
  for (int i = 0; i < right.size() % K; i++) newr.push_back(right[i]);
  reverse(newl.begin(), newl.end());

  if (ct == 0) {
    if (newl.size() + newr.size() <= K) {
      return ans + min((long long)L,
                       (newl.empty() ? 0ll : newl.back() * 2ll) +
                           (newr.empty() ? 0ll : (L - newr.front()) * 2ll));
    } else {
      vector<int> all;
      for (auto a : newl) all.push_back(a);
      for (auto a : newr) all.push_back(a);

      return ans + L + 2ll * min(all[all.size() - K - 1], (L - all[K]));
    }
  } else {
    return ans + (ct + K - 1ll) / K * L;
  }
}
#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...