# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1250172 | haiphong5g0 | Souvenirs (IOI25_souvenirs) | C++20 | 0 ms | 0 KiB |
#include "souvenirs.h"
#include <bits/stdc++.h>
#define task "TEST"
#define task2 "A"
#define pl pair<ll, ll>
#define pf push_front
#define pb push_back
#define pob pop_back
#define pof pop_front
#define mp make_pair
#define fi first
#define se second
#define FOR(i, a, b, c) for (int i=a; i<=b; i+=c)
#define FORE(i, a, b, c) for (int i=a; i>=b; i+=c)
using namespace std;
using ll = long long;
using ull = unsigned long long;
const int Mod = 998244353;
const int maxn = 1e3;
const ll Inf = 1e16;
pair<vector<int>, ll> res;
ll P[maxn+1], num[maxn+1];
pair<vector<int>, ll> F[maxn+1];
void Sub2_3(ll n) {
FOR(i, 1, n-2, 1) {
res = transaction(P[i-1]-2);
for (auto p : res.fi) num[p]++;
if (res.fi[0] != i) P[i] = P[i-1] - 1;
else P[i] = P[i-1] - 2;
}
FOR(i, 1, n-2, 1) FOR(j, num[i], i-1, 1)
transaction(P[i]);
FOR(j, num[n-1], n-2, 1) transaction(P[n-2]-1);
}
void Sub5(ll n) {
ll val = P[0] - 1;
while (true) {
res = transaction(val);
for (auto p : res.fi) num[p]++;
res.se = val - res.se;
F[res.fi[0]] = res;
if (res.fi[0] == n-1) {
P[n-1] = res.se;
break;
}
val /= 2;
}
FORE(i, n-2, 1, -1) {
val *= 2;
if (F[i].fi.size() == 0) {
res = transaction(val);
for (auto p : res.fi) num[p]++;
res.se = val - res.se;
F[i] = res;
}
val = F[i].se;
for (auto p : F[i].fi) val -= P[p];
P[i] = val;
}
FOR(i, 1, n-1, 1) FOR(j, num[i], i-1, 1)
transaction(P[i]);
}
// std::pair<std::vector<int>, long long> transaction(long long M)
void buy_souvenirs(int n, long long P0) {
P[0] = P0;
if (n == 2) transaction(P[0]-1);
else if (n == 3) {
res = transaction(P[0]-1);
if (res.fi.size() == 1) {
transaction(P[0]-res.se-2);
transaction(P[0]-res.se-2);
}
else transaction((P[0]-1-res.se)/2);
}
else Sub5();
}
//7 6 5 4 3 2 1