제출 #1249717

#제출 시각아이디문제언어결과실행 시간메모리
1249717chithanhnguyen선물 (IOI25_souvenirs)C++20
4 / 100
0 ms428 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], sum[MAXN], cnt[MAXN]; bool equation[MAXN][MAXN]; int build_equation(int pay) { auto [items, leftover] = transaction(pay); int total = pay - leftover; int base = items[0]; sum[base] = total; cnt[base]++; for (int i : items) { if (i != base) { equation[base][i] = true; cnt[i]++; if (P[i]) { equation[base][i] = false; sum[base] -= P[i]; } } } return base; } void buy_souvenirs(signed num, int P0) { N = num; equation[0][0] = true; sum[0] = P[0] = P0; cnt[0]++; int known = 1; while (known < N) { int pivot = -1, k = 0; for (int i = N - 1; i >= 0; --i) { if (equation[i][i]) { pivot = i; k = 0; for (int j = pivot; j < N; ++j) if (equation[pivot][j]) ++k; break; } } while (pivot < N - 1) { int next = build_equation((sum[pivot] - 1) / k); pivot = next; k = 0; for (int j = pivot; j < N; ++j) if (equation[pivot][j]) ++k; } int cur = N - known; P[cur] = sum[cur]; ++known; for (int i = 0; i < cur; ++i) { if (equation[i][cur]) { equation[i][cur] = false; sum[i] -= P[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...