제출 #1249843

#제출 시각아이디문제언어결과실행 시간메모리
1249843NekoRolly선물 (IOI25_souvenirs)C++20
100 / 100
12 ms424 KiB
#include "souvenirs.h"
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N = 104;

vector<int> vec,v[N];
ll sum[N];
ll res;
int n,freq[N];
ll p[N];

void my_transaction(ll m){
    auto x = transaction(m);
    vec = x.first;
    res = x.second;
}

void completar(int i){
    while (freq[i] < i){
        transaction(p[i]);
        freq[i]++;
    }
}

ll min_val(ll S,int k){
    int val = k*(k-1)/2;
    S +=  val + k-1;
    return S/k;
}

void go(ll limit){
    // cout << "go : " << limit << "\n";
    my_transaction(limit);
    int pos = *vec.begin();
    sum[pos] = limit - res;
    v[pos] = vec;

    for (int x : vec)
        freq[x]++;

    while (v[pos].size() > 1){
        while (p[v[pos].back()] > 0){
            sum[pos] -= p[v[pos].back()];
            v[pos].pop_back();
        }
        int k = v[pos].size();
        if (k > 1)
            go(min_val(sum[pos], k) - 1);
    }
    // cout << "sale while " << limit << " -> " << sum[pos] << "\n";
    p[pos] = sum[pos];
    if (pos+1 < n && p[pos+1] == 0)
        go(p[pos] - 1);
    // cout << "sale " << limit << "\n";
}

void buy_souvenirs(int N,ll p0){
    n = N;
    p[0] = p0;
    go(p0 - 1);
/*
    cout << "p : ";
    for (int i=0; i<n; i++)
        cout << p[i] << " ";
    cout << "\n";
*/
    for (int i=1; i<n; i++)
        completar(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...