Submission #1277810

#TimeUsernameProblemLanguageResultExecution timeMemory
1277810stephitSouvenirs (IOI25_souvenirs)C++20
4 / 100
1 ms400 KiB
#include "souvenirs.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long

int cnt[101];
ll p[101];

void buy_souvenirs(int n, long long p0) {
    ll t = p0 - 1;
    // từ t / 2^i -> t / 2^(i-1) co nhieu nhat 2 so

    vector<int> v; ll r;
    auto ask = [&](ll M) -> void {
        auto [vv, rr] = transaction(M);
        for (int i : vv) cnt[i]++;
        v = vv, r = rr;
    };
    
    while (1) {
        ask(t);
        if (v.back() == n - 1) {
            if (v.size() == 1) p[n - 1] = t - r;
            if (v.size() == 2) {
                ll tong = t - r;
                ask(tong / 2);
                p[n - 1] = tong / 2 - r;
                p[n - 2] = 36;
            }
            break;
        }
        t /= 2;
    }

    while (t < p0 - 1) {
        t *= 2;
        ask(t);
        while (!v.empty() && p[v.back()] > 0) {
            r += p[v.back()];
            v.pop_back();
        }
        if (v.size() == 1) p[v[0]] = t - r;
        if (v.size() == 2) {
            ll tong = t - r;
            ask(tong / 2);
            p[v[1]] = tong / 2 - r;
            ask(tong - 1);
            p[v[0]] = tong / 2 - r;
        }
    }

    for (int i = 1; i <= n - 1; i++) {
        for (int j = cnt[i] + 1; j <= i; j++) transaction(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...