Submission #1250770

#TimeUsernameProblemLanguageResultExecution timeMemory
1250770starnightsnowSouvenirs (IOI25_souvenirs)C++20
22 / 100
3 ms412 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; extern pair<vector<int>, long long> transaction(long long M); void buy_souvenirs(int N, long long P0) { long long expless1 = P0 - 1; if (N == 2) { auto [gotten, change] = transaction(expless1); return; } if(N == 3){ auto [gotten1, change1] = transaction(expless1); ll use; if(gotten1.size() == 1){ use = (expless1) - change1 - 1; auto [gotten2, change2] = transaction(use); auto [gotten3, change3] = transaction(use); } else{ use = (expless1 - change1 - 1) / 2; auto [gotten2, change2] = transaction(use); } return; } vector<ll> prices(N, -1); prices[0] = P0; vector<int> bought(N, 0); set<int> need; for (int i = 1; i < N; ++i) need.insert(i); while (!need.empty()) { bool done = false; for (int idx : need) { ll low = 1, high = P0 - 1; while (low <= high) { ll mid = (low + high) / 2; auto [gotten, change] = transaction(mid); ll sum = mid - change; for (int g : gotten) bought[g]++; if (gotten.size() == 1 && gotten[0] == idx) { prices[idx] = sum; need.erase(idx); done = true; break; } if (bought[idx] >= idx) { need.erase(idx); done = true; break; } if (find(gotten.begin(), gotten.end(), idx) == gotten.end()) { low = mid + 1; } else { high = mid - 1; } } if (done) break; } if (!done) break; } for (int i = 1; i < N; ++i) { while (bought[i] < i) { auto [gotten, change] = transaction(prices[i]); for (int item : gotten) bought[item]++; } } }
#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...