제출 #1249753

#제출 시각아이디문제언어결과실행 시간메모리
1249753_abaatar선물 (IOI25_souvenirs)C++20
21 / 100
12 ms412 KiB
#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) {

        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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...