제출 #1250006

#제출 시각아이디문제언어결과실행 시간메모리
1250006ZicrusSouvenirs (IOI25_souvenirs)C++20
53 / 100
12 ms416 KiB
#include <bits/stdc++.h> #include "souvenirs.h" using namespace std; typedef long long ll; typedef pair<ll, ll> pll; #define all(v) v.begin(), v.end() constexpr ll inf = 1ll << 62ll; mt19937 mt(time(0)); ll _ = 0; void buy_souvenirs(int N, ll P0) { ll n = N; vector<ll> prices(n); prices[0] = P0; vector<ll> cnt(n); auto ask = [&](ll guess) -> pair<vector<int>, ll> { auto [vec, rem] = transaction(guess); for (auto &e : vec) cnt[e]++; return {vec, rem}; }; vector<optional<pair<vector<int>, ll>>> old(n, nullopt); ll guess = P0-1; while (!prices[n-1]) { auto [vec, rem] = ask(guess); ll paid = guess - rem; if (vec.size() == 1) { prices[vec[0]] = paid; guess = paid-1; continue; } old[vec[0]] = {vec, paid}; guess = paid / vec.size(); } for (ll i = n-2; i >= 1; i--) { if (prices[i]) continue; if (old[i]) { auto [vec, paid] = old[i].value(); for (auto &e : vec) { if (e == i) continue; paid -= prices[e]; } prices[i] = paid; continue; } ll guess = 2 * prices[i+1]; auto [vec, rem] = ask(guess); for (auto &e : vec) { if (e == i) continue; rem += prices[e]; } prices[i] = guess - rem; } for (ll i = 1; i < n; i++) { while (cnt[i] < i) ask(prices[i]); } } #ifdef TEST #include "grader.cpp" #endif
#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...