#ifdef EVAL
#include "souvenirs.h"
#endif
#include <bits/stdc++.h>
using namespace std;
#ifndef EVAL
pair<vector<int>, long long> transaction(long long M);
#endif
void buy_souvenirs(int N, long long P0) {
if (N == 2) {
transaction(P0 - 1);
return;
}
if (N == 3) {
auto [v, x] = transaction(P0 - 1);
if (v.size() == 2) {
long long sum = P0 - 1 - x;
transaction(sum / 2);
}
else {
long long P1 = P0 - 1 - x;
transaction(P1 - 1);
transaction(P1 - 1);
}
return;
}
pair<vector<int>, long long> ans;
// int cur = 1;
// int cnt = 0;
// long long cur_q = P0 - 1;
// while (true) {
// ans = transaction(cur_q);
// if (!(ans.second == 0 && ans.first.size() == 1 && ans.first[0] == cur)) {
// break;
// }
// cnt++;
// if (cnt == cur) {
// cur++;
// cnt = 0;
// cur_q--;
// if (cur == N) {
// return;
// }
// }
// }
vector<long long> price(N);
price[0] = P0;
bool found_last = false;
int cnt_last = 0;
for (int i = 1; i < N - 1; i++) {
ans = transaction(price[i - 1] - 1);
if (ans.first.size() == 2) {
price[N - 1] = 1;
cnt_last++;
price[i] = price[i - 1] - 2;
}
else {
if (ans.second == 0) {
price[i] = price[i - 1] - 1;
}
else {
price[i] = price[i - 1] - 2;
}
}
for (int j = 2; j <= i; j++) {
transaction(price[i]);
}
}
if (found_last) {
for (int i = cnt_last + 1; i < N; i++) {
transaction(1);
}
}
else {
for (int i = 1; i < N; i++) {
transaction(price[N - 2] - 1);
}
}
}
#ifndef EVAL
pair<vector<int>, long long> transaction(long long M) {
return {{}, M};
}
#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... |