Submission #1265747

#TimeUsernameProblemLanguageResultExecution timeMemory
1265747SHZhangSouvenirs (IOI25_souvenirs)C++20
100 / 100
11 ms408 KiB
#include "souvenirs.h"
#include <utility>
#include <vector>
#include <cstdlib>
#include <cstdio>

using namespace std;

#define ll long long

int n;

ll price[105];
int uses[105];

int solve(int right, ll spend)
{
    pair<vector<int>, ll> result = transaction(spend);
    for (int x: result.first) {
        uses[x]++;
    }
    int left = result.first[0];
    ll amt_spent = spend - result.second;
    while (result.first.back() > right) {
        amt_spent -= price[result.first.back()];
        result.first.pop_back();
    }
    if (left < right) {
        while (true) {
            int left2 = solve(right, (amt_spent - 1LL) / (ll)(result.first.size()));
            while (result.first.back() >= left2) {
                amt_spent -= price[result.first.back()];
                result.first.pop_back();
            }
            if (left2 == left + 1) break;
            right = left2 - 1;
        }
    }
    price[left] = amt_spent;
    return left;
}

void buy_souvenirs(int N, ll P0) {
    n = N;
    solve(n - 1, P0 - 1);
    for (int i = 1; i < n; i++) {
        for (int j = 1; j <= i - uses[i]; j++) {
            transaction(price[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...