Submission #1258515

#TimeUsernameProblemLanguageResultExecution timeMemory
1258515am_aadvikSouvenirs (IOI25_souvenirs)C++20
100 / 100
12 ms420 KiB
#include <iostream> #include <vector> #include <set> #define int long long using namespace std; struct comp{ bool operator()(pair<set<int32_t>, int> a, pair<set<int32_t>, int> b) const { return *a.first.begin() > *b.first.begin(); } }; pair<vector<int32_t>, int> transaction(int m); pair<set<int32_t>, int> equate(vector<int32_t>& idx, int l, int o, vector<int>& cnt) { set<int32_t> f; for (auto x : idx) f.insert(x), ++cnt[x]; return make_pair(f, o - l); } void buy_souvenirs(int32_t n, int p0) { auto r = transaction(p0 - 1); set<pair<set<int32_t>, int>, comp> s; vector<int> p(n, -1), cnt(n, 0); set<int32_t> u; for (int i = 1; i < n; ++i) u.insert(i); s.insert(equate(r.first, r.second, p0 - 1, cnt)); while (s.size() && u.size()) { auto c = *s.begin(); vector<int> rm; for (auto x : c.first) if (p[x] != -1) rm.push_back(x); for (auto x : rm) c.first.erase(x), c.second -= p[x]; if (c.first.size() > 1) { int nxt = c.second / c.first.size(); r = transaction(nxt); s.insert(equate(r.first, r.second, nxt, cnt)); } else { int idx = *c.first.begin(); u.erase(idx); p[idx] = c.second; s.erase(s.begin()); if (!u.size()) break; if (*u.rbegin() > idx) { int nxt = c.second - 1; r = transaction(nxt); s.insert(equate(r.first, r.second, nxt, cnt)); } } } for (int i = 1; i < n; ++i) for (int j = cnt[i]; j < i; ++j) 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...