Submission #1310201

#TimeUsernameProblemLanguageResultExecution timeMemory
1310201kunzaZa183Souvenirs (IOI25_souvenirs)C++20
100 / 100
13 ms400 KiB
#include "souvenirs.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

void buy_souvenirs(int N, long long P0) {
  vector<int> times(N);
  vector<pair<vector<int>, ll>> vpv(N, {{}, -1});
  vpv[0] = {{}, P0};

  auto ask = [&](ll x) {
    auto smt = transaction(x);
    for (auto a : smt.first)
      times[a]++;
    vpv[smt.first[0]] = {smt.first, x - smt.second};
    vpv[smt.first[0]].first.erase(vpv[smt.first[0]].first.begin());
  };

  while (1) {

    for (int i = 1; i < N; i++) {
      if (vpv[i].first.empty() && vpv[i].second == -1 &&
          vpv[i - 1].first.empty() && vpv[i - 1].second != -1) {
        ask(vpv[i - 1].second - 1);
      }
    }

    for (int i = 0; i < N; i++) {
      if (vpv[i].first.empty())
        continue;
      for (int j = vpv[i].first.size() - 1; j >= 0; j--) {
        if (vpv[vpv[i].first[j]].first.empty() &&
            vpv[vpv[i].first[j]].second != -1) {
          vpv[i].second -= vpv[vpv[i].first[j]].second;
          vpv[i].first.erase(vpv[i].first.begin() + j);
        }
      }

      if (vpv[i].first.empty())
        continue;

      for (int j = i + 1; j <= vpv[i].first.back(); j++) {
        if (vpv[j].second != -1) {
          goto A;
        }
      }
      ask(vpv[i].second / (vpv[i].first.size() + 1));
    A:;
    }

    for (int i = 0; i < N; i++) {
      if (vpv[i].second == -1 || !vpv[i].first.empty()) {
        goto B;
      }
    }
    break;
  B:;
  }

  for (int i = 0; i < N; i++) {
    while (i != times[i])
      ask(vpv[i].second);
  }
}
#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...