#include "souvenirs.h"
#include <utility>
#include <vector>
#include <cassert>
#include <algorithm>
#include <numeric>
#include <iostream>
#include <cstring>
using namespace std;
const int Ma = 5e2+10;
using ll = long long;
int sold[111];
void buy_souvenirs(int N, long long P0) {
if (N == 3) {
transaction(P0);
return;
ll lo = 1;
while (1) {
if (lo >= P0) {
lo = P0 - 1;
}
auto res = transaction(lo);
if (res.first.size() == 2) {
transaction((lo - 1) >> 1);
return;
}
if (res.first.size() == 1) {
if (res.first[0] == 1) {
ll p1 = lo - res.second;
transaction(p1 - 1);
transaction(p1 - 1);
return;
}
else {
ll p2 = lo - res.second;
auto res1 = transaction(P0 - 1);
if (res1.first.size() == 2) return;
transaction(p2);
return;
}
}
else {
lo = 3 + lo << 1;
}
}
return;
}
for (int i = 1; i < N; i++) sold[i] = i;
ll cur = P0 - 1;
bool hasOne = false;
for (int i = 1; i < N; i++) {
if (i == N - 1 && hasOne == true) {
while (sold[N - 1]-- > 0) transaction(1);
return;
}
auto res = transaction(cur);
sold[i]--;
if (res.second == 1) { // no price 1 and p[i] = p[i - 1] - 2
while (sold[i]-- > 0) {
transaction(cur - 1);
}
cur -= 2;
}
else { // res.second = 0
if (res.first.size() == 1) { // p[i] = p[i - 1] - 1
while (sold[i]-- > 0) {
transaction(cur);
}
cur -= 1;
}
else { // p[i] = p[i - 1] - 2 and hasOne = true
hasOne = true;
sold[N - 1]--;
while (sold[i]-- > 0) {
transaction(cur - 1);
}
cur -= 2;
}
}
}
}
# | 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... |