Submission #1251001

#TimeUsernameProblemLanguageResultExecution timeMemory
1251001flashmtSouvenirs (IOI25_souvenirs)C++20
25 / 100
12 ms428 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;
  if (size(ids) == 1)
  {
    p[curId] = cost;
    if (curId < n - 1)
      go(cost - 1);
  }
  else
  {
    // xxx..x.x
    if (ids.back() > nextId)
    {
      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;
  }
}

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...