제출 #1252223

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

#define int long long
#define sz(x) (int)(x).size()

const int MAXN = 105;
int N;
int P[MAXN], rhs[MAXN], cnt[MAXN];
bool equation[MAXN][MAXN];

int build_equation(int M) {
    auto [items, leftover] = transaction(M);
    if (items.empty()) exit(0);
    int total = M - leftover;
    int base = items[0];
    rhs[base] = total;
    cnt[base]++;

    for (int i : items) {
        equation[base][i] = true;
        if (i != base) {
            cnt[i]++;
            if (P[i] && equation[base][i]) {
                equation[base][i] = false;
                rhs[base] -= P[i];
            }
        }
    }
    return base;
}

void buy_souvenirs(signed num, int P0) {
    N = num;
    equation[0][0] = true;
    rhs[0] = P0; P[0] = P0;

    int cur = N;
    while (cur != 0) {
        int pivot = -1, k = 1;
        for (int i = cur - 1; i >= 0; --i) {
            if (equation[i][i]) {
                pivot = i;
                k = accumulate(equation[i] + i, equation[i] + cur, 0LL);
                break;
            }
        }

        if (pivot == -1) exit(0);

        while (pivot < cur - 1) {
            pivot = build_equation((rhs[pivot] - 1) / k);
            k = accumulate(equation[pivot] + pivot, equation[pivot] + cur, 0LL);
        }

        P[cur - 1] = rhs[cur - 1];
        for (int i = 0; i < cur - 1; ++i) {
            if (equation[i][cur - 1]) {
                equation[i][cur - 1] = 0;
                rhs[i] -= P[cur - 1];
            }
        }

        --cur;
    }

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