Submission #1257940

#TimeUsernameProblemLanguageResultExecution timeMemory
1257940Canuc80kSouvenirs (IOI25_souvenirs)C++20
7 / 100
12 ms412 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;

std::pair<std::vector<int>, long long> transaction(long long M);

ll n;
ll res[201], cnt[201];

void guess(ll price) {
    auto [v, x] = transaction(price);
    for (auto x: v) cnt[x] ++;
    price -= x;
    
    for (int i = v.size() - 1; i >= 1; i --) {
        if (res[v[i]] != 1e18) {price -= res[v[i]]; continue;}
        ll rem = 0; for (int j = 0; j < i; j ++) rem += (v[j] - v[i]);
        guess((price - rem) / (i + 1));
        price -= res[v[i]];
    }
    res[v[0]] = price;

    ll nxt = v[0] + 1; 
    while (nxt != n && res[nxt] != 1e18) nxt ++;
    if (nxt == n && res[n - 1] != 1e18) return;
    guess(res[nxt - 1] - 1);
}

void buy_souvenirs(int n, long long p) {
    ::n = n;
    res[0] = p; for (int i = 1; i < n; i ++) res[i] = 1e18;
    guess(res[0] - 1);
    for (int i = 1; i < n; i ++)
        for (int j = cnt[i] + 1; j <= i; j ++)
            transaction(res[i]);

    // for (int i = 0; i < n; i ++) cout << cnt[i] << ' '; cout << endl;
    // for (int i = 0; i < n; i ++) cout << res[i] << ' '; cout << endl;
}
#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...