//#define test
#ifndef test
#include "souvenirs.h"
#endif // test
#include<bits/stdc++.h>
using namespace std;
int cntBought[101];
#ifdef test
vector<long long> P = {100, 99, 98, 97, 60, 59, 58, 57, 20, 19, 18, 17, 4, 3, 2, 1};
void quit(const char* message){
printf("%s\n", message);
exit(0);
}
const int CALLS_CNT_LIMIT = 10000;
int calls_cnt;
pair<vector<int>, long long> transaction(long long M){
calls_cnt++;
if(calls_cnt > CALLS_CNT_LIMIT)
quit("Too many calls");
if(M >= P[0] || M < P.back())
quit("Invalid argument");
vector<int> ret;
for(int i = 1; i < P.size(); ++i)
if(P[i] <= M){
M -= P[i];
ret.push_back(i);
++cntBought[i];
}
return make_pair(ret, M);
}
#endif // test
void buy_souvenirs(int N, long long P0){
vector<long long> p(N, -1), sumUnknown(N, 0);
p[0] = P0;
set<int> s[N];
while(1){
bool unknown = false;
for(int i = N - 1; i >= 0; --i){
if(p[i] == -1)
unknown = true;
if(p[i] != -1 && unknown){
pair<vector<int>, long long> tmp = transaction(p[i] - 1);
sumUnknown[i + 1] = p[i] - 1 - tmp.second;
for(int j : tmp.first){
if(p[j] != -1)
sumUnknown[i + 1] -= p[j];
else
s[i + 1].insert(j);
}
break;
}
if(s[i].size() == 1){
p[i] = sumUnknown[i];
s[i].clear();
for(int j = 0; j < N; ++j){
auto pt = s[j].find(i);
if(pt != s[j].end()){
sumUnknown[j] -= p[i];
s[j].erase(pt);
}
}
break;
}
if(s[i].size()){
long long x = sumUnknown[i] / s[i].size();
pair<vector<int>, long long> tmp = transaction(x);
long long sum = x - tmp.second;
int lgs = N;
for(int j : tmp.first){
if(p[j] != -1)
sum -= p[j];
else{
if(lgs == N)
lgs = j, s[lgs].clear();
s[lgs].insert(j);
}
}
sumUnknown[lgs] = sum;
break;
}
}
if(!unknown)
break;
}
for(int i = 1; i < N; ++i)
while(cntBought[i] < i)
transaction(p[i]);
}
#ifdef test
int main(){
buy_souvenirs(P.size(), P[0]);
}
#endif
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |