Submission #1366213

#TimeUsernameProblemLanguageResultExecution timeMemory
1366213mannshah1211Souvenirs (IOI25_souvenirs)C++20
100 / 100
8 ms412 KiB
#include "souvenirs.h"
#include <bits/stdc++.h>

using namespace std;

void buy_souvenirs(int n, long long p0) {
  vector<set<int>> sts(n);
  vector<long long> sums(n), ans(n, -1);
  ans[0] = p0;
  vector<int> ops(n);
  while (count(ans.begin(), ans.end(), -1)) {
    bool miss = false; // u da real miss
    for (int i = n - 1; i >= 0; i--) {
      if (ans[i] == -1) {
        miss = true;
      }
      if (ans[i] != -1 && miss) {
        auto [v, l] = transaction(ans[i] - 1);
        set<int> s;
        for (int x : v) {
          s.insert(x);
          ops[x] += 1;
        }
        long long got = ans[i] - 1 - l;
        for (int j = 0; j < n; j++) {
          if (ans[j] != -1 && s.find(j) != s.end()) {
            s.erase(j);
            got -= ans[j];
          }
        }
        sts[i + 1] = s;
        sums[i + 1] = got;
        break;
      }
      if (sts[i].size() == 1) {
        ans[i] = sums[i];
        sts[i].clear();
        for (int j = 0; j < n; j++) {
          if (sts[j].count(i)) {
            sums[j] -= ans[i];
            sts[j].erase(i);
          }
        }
        break;
      }
      if (sts[i].size()) {
        long long x = sums[i] / static_cast<long long>(sts[i].size());
        auto [v, l] = transaction(x);
        set<int> s;
        for (int x : v) {
          s.insert(x);
          ops[x] += 1;
        }
        long long got = x - l;
        for (int j = 0; j < n; j++) {
          if (ans[j] != -1 && s.find(j) != s.end()) {
            got -= ans[j];
            s.erase(j);
          }
        }
        int k = *s.begin();
        sts[k] = s;
        sums[k] = got;
        break;
      }
    }
  }
  for (int i = 0; i < n; i++) {
    while (ops[i] < i) {
      transaction(ans[i]);
      ops[i] += 1;
    }
  }
  return;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...