Submission #1256050

#TimeUsernameProblemLanguageResultExecution timeMemory
1256050Turkhuu선물 (IOI25_souvenirs)C++20
39 / 100
12 ms976 KiB
#include "souvenirs.h"
#include <bits/stdc++.h>
#define FOR(i, a, b) for (auto i = (a); i <= (b); i++)
#define ROF(i, a, b) for (auto i = (a); i >= (b); i--)
using namespace std;
using ll = long long;
int N;
vector<bool> known;
vector<ll> P;
vector<int> C;
vector<pair<set<int>, ll>> res;
pair<set<int>, ll> query(ll M) {
    auto [v, x] = transaction(M);
    x = M - x;
    set<int> s;
    for (int i : v) {
        C[i]++;
        if (!known[i]) s.insert(i);
        else x -= P[i];
    }
    res.push_back({s, x});
    return {s, x};
}
void buy_rest() {
    FOR(i, 0, N - 1) while (C[i] < i) query(P[i]);
}
void know(int i, ll x) {
    if (known[i]) return;
    // assert(!known[i]);
    P[i] = x, known[i] = 1;
    for (auto& p : res) {
        auto& s = p.first;
        auto& x = p.second;
        if (s.count(i)) {
            s.erase(i);
            x -= P[i];
        }
        if (s.size() == 1) know(*s.begin(), x);
    }
}
void solve(int S) {
    assert(known[S]);
    bool all = 1;
    FOR(i, S, N - 1) if (!known[i]) all = 0;
    if (all) return;
    if (known[S + 1]) {
        solve(S + 1);
        return;
    }
    // cout << ":: " << S << " " << P[S] << "\n";
    auto [s, x] = query(P[S] - 1);
    while (s.size() > 1) {
        int m = s.size();
        // cout << " ## " << x << " " << m << "\n";
        auto [s2, x2] = query(x / m);
        s = s2, x = x2;
    }
    if (s.empty()) {
        // cout << "aa\n";
    }
    int i = *s.begin();
    know(i, x);
    solve(i);
    solve(S);
}
void buy_souvenirs(int _N, long long P0) {
    N = _N, P.resize(N), C.resize(N), known.resize(N);
    know(0, P0);
    solve(0);
    buy_rest();
}
#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...