# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1249461 | bronze_coder | Souvenirs (IOI25_souvenirs) | C++20 | 0 ms | 0 KiB |
#include "souvenirs.h"
#include <bits/stdc++.h>
using namespace std;
pair<vector<int>, long long> transaction(long long M){
cout << M << endl;
vector<int> ans;
for(int i=0;i<q.size();i++){
if(q[i]<=M){
M -= q[i];
ans.push_back(i);
}
}
for(int i:ans){
cout << i << " ";
}
cout << "\n\n";
return {ans,M};
}
void buy_souvenirs(int N, long long P0){
vector<vector<long long>> answers(N);
vector<int> count(N,0);
for(int i=0;i<N;i++){
vector<long long> x(N+2,0);
answers[i] = x;
}
answers[0][0] = 1;
answers[0][N] = P0;
answers[0][N+1] = 1;
vector<long long> cost(N,-1);
for(int i=N-1;i>=0;i--){
for(int j=i;j>=0;j--){
if(answers[j][N+1]>0){
int index = j;
while(index<i){
long long c = (answers[index][N]-1)/answers[index][N+1];
pair<vector<int>, long long> x = transaction(c);
vector<int> a = x.first;
vector<long long> b(N+2,0);
b[N+1] = a.size();
b[N] = c-x.second;
for(int k=i+1;k<N;k++){
if(b[k]){
b[k] = 0;
b[N] -= cost[k];
b[N+1]--;
}
}
for(int z:a){
b[z] = 1;
count[z]++;
}
index = a[0];
answers[index] = b;
}
break;
}
}
cost[i] = answers[i][N];
for(int j=0;j<i;j++){
if(answers[j][i]){
answers[j][N+1]--;
answers[j][N] -= cost[i];
answers[j][i] = 0;
}
}
}
for(int i=0;i<N;i++){
for(int j=0;j<i-count[i];j++){
transaction(cost[i]);
}
}
}