Submission #1258002

#TimeUsernameProblemLanguageResultExecution timeMemory
1258002avighnaSouvenirs (IOI25_souvenirs)C++20
7 / 100
12 ms400 KiB
#include <cassert>
#include <utility>
#include <vector>

std::pair<std::vector<int>, long long> transaction(long long M);

void buy_souvenirs(int N, long long P0) {
  if (N == 2) {
    auto res = transaction(P0 - 1);
    return;
  }

  std::vector<int> have(N); // for each type we want have[i] == i
  std::vector<int> a(N);    // retreived array
  a[0] = P0;
  // check if the last element is 1
  if (transaction(1).second == 0) {
    have[N - 1]++, a[N - 1] = 1;
  }
  for (int i = 1; i < N; ++i) {
    if (have[i] == i) {
      assert(i == N - 1 && a[i] == 1);
      continue;
    }
    if (!a[i]) {
      auto [got, rem] = transaction(a[i - 1] - 1); // it can either be -1 or -2
      if (rem == 0) {
        // it was -1, or it could be -2 and the last element is 1
        a[i] = a[i - 1] - 1 - (got.back() == N - 1);
      } else {
        a[i] = a[i - 1] - 2; // it was -2
      }
      for (int &x : got) {
        have[x]++;
      }
    }
    while (have[i] < i) {
      transaction(a[i]);
      have[i]++;
    }
  }
}
#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...