제출 #1254818

#제출 시각아이디문제언어결과실행 시간메모리
1254818rxlfd314Souvenirs (IOI25_souvenirs)C++20
7 / 100
12 ms420 KiB
#include "souvenirs.h" #include <bits/stdc++.h> using namespace std; using ll = long long; using ari2 = array<int, 2>; using ari3 = array<int, 3>; using arl2 = array<ll, 2>; using arl3 = array<ll, 3>; template <class T> using vt = vector<T>; #define all(x) begin(x), end(x) #define size(x) (int((x).size())) #define REP(a,b,c,d) for(int a=(b);(d)>0?a<=(c):a>=(c);a+=(d)) #define FOR(a,b,c) REP(a,b,c,1) #define ROF(a,b,c) REP(a,b,c,-1) void buy_souvenirs(const int N, const ll P0) { vt<ll> P(N); P[0] = P0; vt<int> cnt(N); map<ll, pair<vt<int>, ll>> cache; const auto ask = [&](const ll v) { if (cache.find(v) != cache.end()) return cache[v]; const auto [vec, rem] = transaction(v); for (const auto &j : vec) cnt[j]++; return make_pair(vec, v - rem); }; ROF(i, N-1, 1) { ll cur = P[0] - 1; while (!P[i]) { auto [vec, used] = ask(cur); int n = size(vec); for (const auto &j : vec) used -= P[j], n -= j > i; if (n == 1) P[vec.back()] = used; cur = (used + n - 1) / n - 1; } } FOR(i, 1, N-1) for (; cnt[i] < i; cnt[i]++) transaction(P[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...