# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1257464 | math_rabbit_1028 | Souvenirs (IOI25_souvenirs) | C++20 | 0 ms | 0 KiB |
#include "souvenirs.h"
#include <bits/stdc++.h>
using namespace std;
vector<long long> P;
vector<int> cnt;
vector<long long> total;
vector< pair<vector<int>, long long> > transactions;
void update(vector<int> &ls) {
for (int x : ls) cnt[x]++;
}
void buy_souvenirs(int N, long long P0) {
// pair<vector<int>, long long> res = transaction(3);
P.resize(N);
P[0] = P0;
cnt.resize(N);
transactions.push_back(transaction(P0-1));
total.pop_back(P0-1);
for (int i = 1; i < N; i++) {
P0 /= 2;
assert(P0 > 0);
transactions.push_back(transaction(P0));
total.push_back(P0);
}
reverse(transactions.begin(), transactions.end());
for (auto &tr : transactions) {
update(tr.first);
for (int i = 1; i < tr.first.size(); i++) total[total.size()-1] -= P[tr.first[i]];
total[total.size()-1] -= tr.second;
P[tr.first[0]] = total.back();
total.pop_back();
}
for (int i = 1; i < N; i++) {
for (int j = cnt[i]+1; j <= i; j++) transaction(P[i]);
}
return;
}