Submission #1249424

#TimeUsernameProblemLanguageResultExecution timeMemory
1249424weirdflexbutokSouvenirs (IOI25_souvenirs)C++20
100 / 100
12 ms412 KiB
#include "souvenirs.h" #include<bits/stdc++.h> using namespace std; using i64 = long long; std::mt19937_64 rng(std::chrono::steady_clock::now().time_since_epoch().count()); const i64 MX = 1e15; void buy_souvenirs(int n, i64 P0){ std::vector<i64> p(n); p[0] = P0; std::set<std::pair<std::vector<int>, i64>> S;//[p1, p2 ... pn], cost std::vector<int> sc = {0}; S.insert(make_pair(sc, p[0])); std::vector<int> EQ(n), CNT(n); // we have an eqn where min index = i while(!S.empty()){ auto [v, sm] = *S.rbegin(); S.erase(*S.rbegin()); //first update indices to latest std::vector<int> nv; for(auto x : v){ if(p[x]) sm -= p[x]; else nv.push_back(x); } if(v.front() == 0){ //ask 0! auto [res, rem] = transaction(p[0] - 1); i64 used = p[0] - 1 - rem; EQ[res.front()] = 1; S.insert(std::make_pair(res, used)); for(auto x : res) CNT[x]++; // cout << S.size() << '\n'; } else if(nv.empty()){ //do nothing } else if(nv.size() == 1){ p[nv.back()] = sm; auto i = nv.back(); if(i + 1 < n and EQ[i + 1] == 0){ auto [res, rem] = transaction(p[i] - 1); for(auto x : res) CNT[x]++; i64 used = p[i] - 1 - rem; EQ[res.front()] = 1; assert(res.front() == i + 1); S.insert(make_pair(res, used)); } } else{ //ask sm / n i64 old = sm; sm /= nv.size(); auto [res, rem] = transaction(sm); for(auto x : res) CNT[x]++; i64 used = sm - rem; EQ[res.front()] = 1; EQ[nv.front()] = 1; S.insert(make_pair(res, used)); S.insert(make_pair(nv, old)); } } for(int i = 0; i < n; i++){ while(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...