Submission #1249760

#TimeUsernameProblemLanguageResultExecution timeMemory
1249760_abaatar선물 (IOI25_souvenirs)C++20
7 / 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) { 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 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...