Submission #1251025

#TimeUsernameProblemLanguageResultExecution timeMemory
1251025flashmtSouvenirs (IOI25_souvenirs)C++20
39 / 100
12 ms412 KiB
#include "souvenirs.h"
#include <bits/stdc++.h>
#ifdef LOCAL
#include "Debug.h"
#else
#define debug(...) 42
#endif
using namespace std;

int n;
vector<int> bought;
vector<long long> p;

pair<vector<int>, long long> buy(long long coins)
{
  auto [ids, rem] = transaction(coins);
  for (int i : ids)
    bought[i]++;
  return {ids, coins - rem};
}

void go(long long maxP)
{
  auto [ids, cost] = buy(maxP);
  int curId = ids[0], nextId = curId;
  for (int i : ids)
    if (i == nextId)
      nextId++;

  int len = nextId - curId;
  // xxx..x.x
  if (ids.back() > nextId)
  {
    int need = 0;
    for (int i : ids)
      if (i > nextId && p[i] == 0)
        need = 1;

    if (need)
      go(cost / (len + 1));

    for (int i : ids)
      if (i > nextId)
        cost -= p[i];
  }

  // xxx.....
  for (int i = len; i >= 2; i--)
  {
    int id = curId + i - 1;
    if (p[id] == 0)
      go(cost / len);
    cost -= p[id];
  }

  p[curId] = cost;

  for (int i = curId + 1; i < n; i++)
    if (p[i] == 0)
    {
      go(p[i - 1] - 1);
      return;
    }
}

void buy_souvenirs(int N, long long p0) {
  n = N;
  bought.assign(n, 0);
  p.assign(n, 0);
  go(p0 - 1);
  for (int i = 1; i < n; i++)
  {
    assert(bought[i] <= i && p[i] > 0);
    while (bought[i] < i)
      buy(p[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...