Submission #1252572

#TimeUsernameProblemLanguageResultExecution timeMemory
1252572anfiSouvenirs (IOI25_souvenirs)C++20
100 / 100
12 ms412 KiB
#include "souvenirs.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; static const int MAXN = 105; int n, last_idx; ll p[MAXN]; int cnt_visit[MAXN]; ll calc_next(ll s, int k) { s += (ll)k * (k - 1) / 2 + k - 1; return s / k; } struct Frame { ll money; vector<int> v; ll sum; int stage; }; void build_iterative(ll initial_money) { vector<Frame> stk; stk.reserve(MAXN); stk.push_back({initial_money, {}, 0, 0}); while (!stk.empty()) { Frame &f = stk.back(); if (f.stage == 0) { auto [v, remain] = transaction(f.money); ll s = f.money - remain; f.v = v; f.sum = s; for (int idx : f.v) cnt_visit[idx]++; f.stage = 1; } else if (f.stage == 1 || f.stage == 2) { if (!f.v.empty() && f.v[0] < last_idx) { while (!f.v.empty() && f.v.back() >= last_idx) { f.sum -= p[f.v.back()]; f.v.pop_back(); } if (!f.v.empty() && f.v[0] + 1 != last_idx) { f.stage = 2; ll next_money = calc_next(f.sum, f.v.size()) - 1; stk.push_back({next_money, {}, 0, 0}); continue; } } f.stage = 3; } else if (f.stage == 3) { if (!f.v.empty()) { int idx = f.v[0]; p[idx] = f.sum; last_idx = idx; } stk.pop_back(); } } } void buy_souvenirs(int N, ll P0) { n = N; last_idx = N; memset(p, 0, sizeof(p)); memset(cnt_visit, 0, sizeof(cnt_visit)); p[0] = P0; build_iterative(P0 - 1); for (int i = 1; i < n; ++i) { while (cnt_visit[i] < i) { transaction(p[i]); cnt_visit[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...