#include <bits/stdc++.h>
#include "souvenirs.h"
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pll;
#define all(v) v.begin(), v.end()
constexpr ll inf = 1ll << 62ll;
mt19937 mt(time(0));
ll _ = 0;
void buy_souvenirs(int N, ll P0) {
ll n = N;
vector<ll> prices(n);
prices[0] = P0;
vector<ll> cnt(n);
auto ask = [&](ll guess) -> pair<vector<int>, ll> {
auto [vec, rem] = transaction(guess);
for (auto &e : vec) cnt[e]++;
return {vec, rem};
};
vector<optional<pair<vector<int>, ll>>> old(n, nullopt);
ll guess = P0-1;
while (!prices[n-1]) {
auto [vec, rem] = ask(guess);
ll paid = guess - rem;
if (vec.size() == 1) {
prices[vec[0]] = paid;
guess = paid-1;
continue;
}
old[vec[0]] = {vec, paid};
guess = paid / vec.size();
}
for (ll i = n-2; i >= 1; i--) {
if (prices[i]) continue;
if (old[i]) {
auto [vec, paid] = old[i].value();
for (auto &e : vec) {
if (e == i) continue;
paid -= prices[e];
}
prices[i] = paid;
continue;
}
ll guess = 2 * prices[i+1];
auto [vec, rem] = ask(guess);
for (auto &e : vec) {
if (e == i) continue;
rem += prices[e];
}
prices[i] = guess - rem;
}
for (ll i = 1; i < n; i++) {
while (cnt[i] < i) ask(prices[i]);
}
}
#ifdef TEST
#include "grader.cpp"
#endif
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |