Submission #1284663

#TimeUsernameProblemLanguageResultExecution timeMemory
1284663axorynSouvenirs (IOI25_souvenirs)C++20
0 / 100
1 ms332 KiB
#include "souvenirs.h" #include <vector> #include <numeric> #include <algorithm> #include <map> void buy_souvenirs(int N, long long P0) { std::vector<long long> p(N); p[0] = P0; std::map<int, int> counts; long long current_sum = 0; // Phase 1: Price Discovery for (int i = 1; i < N; ++i) { current_sum += p[i - 1]; long long low = 1, high = p[i - 1] - 1; long long found_p = p[i - 1]; while (low <= high) { long long mid = low + (high - low) / 2; if (mid == 0) { low = 1; continue; } auto result = transaction(current_sum + mid); for(int item : result.first) { counts[item]++; } bool bought_i = false; // The returned vector is sorted, so we can check efficiently. for (int item : result.first) { if (item == i) { bought_i = true; break; } if (item > i) { break; } } if (bought_i) { found_p = mid; high = mid - 1; } else { low = mid + 1; } } p[i] = found_p; } // Phase 2: Purchasing missing souvenirs // We iterate from N-1 down to 0 to ensure that when we buy item i, // we don't accidentally buy any other items we still need. for (int i = N - 1; i >= 0; --i) { if (counts.find(i) == counts.end() || counts[i] < 1) { // A transaction with p[i] coins will buy souvenir i and nothing else. auto res = transaction(p[i]); for(int item : res.first) { counts[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...