Submission #1338021

#TimeUsernameProblemLanguageResultExecution timeMemory
1338021theobitoSouvenirs (IOI25_souvenirs)C++20
25 / 100
13 ms344 KiB
#include "souvenirs.h"
#include <utility>
#include <vector>
#include <stack>

using namespace std;

void buy_souvenirs(int N, long long P0) {

  vector<long long> val(N, -1);
  vector<int> cnt(N, 0);
  val[0] = P0;

  int known = 1;

  stack<pair<vector<int>, long long>> s;

  while (known < N) {
    if (s.size()) {
      vector<int> a = s.top().first;
      long long sum = s.top().second;
      s.pop();
      
      vector<int> b;
      for (int &x : a) {
        if (val[x] != -1) sum -= val[x];
        else b.push_back(x);
      }
      swap(a, b);

      if (a.size() == 1) {
        val[a[0]] = sum;
        ++known;
      } else if (a.size() > 1) {
        s.push({a, sum});
        long long n = a.size();
        auto [res, rem] = transaction(sum / n);
        for (int &i : res) ++cnt[i];
        s.push({res, sum / n - rem});
      }
    } else {
      int i = N - 1;
      for (; i >= 0; i--) if (val[i] != -1) break;
      auto [res, rem] = transaction(val[i] - 1);
      for (int &i : res) ++cnt[i];
      s.push({res, val[i] - 1 - rem});
    }
  }

  for (int i = 1; i < N; i++) {
    while (cnt[i] < i) {
      transaction(val[i]);
      ++cnt[i];
    }
  }

  return;
}
#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...