제출 #1251414

#제출 시각아이디문제언어결과실행 시간메모리
1251414InternetPerson10선물 (IOI25_souvenirs)C++20
100 / 100
13 ms424 KiB
#include "souvenirs.h"
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

ll counts[2001];
ll costs[2001];

pair<vector<int>, ll> make_transaction(ll P) {
    vector<int> v;
    ll x;
    tie(v, x) = transaction(P);
    for(int g : v) counts[g]++;
    return {v, x};
}

pair<vector<int>, ll> remove_known(vector<int> v, ll left) {
    vector<int> v2;
    v2.clear();
    for(int g : v) {
        if(costs[g] != -1) {
            left -= costs[g];
        }
        else {
            v2.push_back(g);
        }
    }
    return {v2, left};
}

void try_buy(int n, ll p) {
    cerr << "Try bought with " << p << endl;
    ll x;
    vector<int> v;
    tie(v, x) = make_transaction(p);
    int ret_val = v[0];
    // goal: determine costs[ret_val] and everything below it.
    ll left = p-x;
    tie(v, left) = remove_known(v, left);
    while(v.size() > 1) {
        try_buy(n, left/(int)(v.size()));
        tie(v, left) = remove_known(v, left);
    }
    assert(v[0] == ret_val);
    cerr << "Determined " << ret_val << " to be " << left << endl;
    costs[ret_val] = left;
    if(ret_val != n-1 && costs[ret_val+1] == -1) try_buy(n, left-1);
}

void buy_souvenirs(int N, long long P0) {
    for(int i = 0; i < N; i++) {
        costs[i] = -1;
    }
    costs[0] = P0;
    // pair<vector<int>, ll> res = transaction(3);
    try_buy(N, P0-1);
    for(int i = 1; i < N; i++) {
        assert(counts[i] <= i);
        assert(costs[i] != -1);
        while(counts[i] < i) {
            make_transaction(costs[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...