# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1251027 | a1exeyy | 선물 (IOI25_souvenirs) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
#include "souvenirs.h"
using namespace std;
using ll = long long;
vector<ll> vv;
vector<int> tr;
vector<ll> vl;
int n;
int solve(int r, ll k) {
// for (auto i : vl) cout << i << " "; cout << r << " - " << k << "\n";
auto [vec, sm] = transaction(k);
sm = k - sm;
for (auto i : vec) tr[i]--;
int f = 1;
for (int i = 1; i < vec.size(); i++) f &= vl[vec[i]] != -1;
int i = vec[0];
if (f) {
vl[i] = sm;
for (int j : vec) if (j != i) vl[i] -= vl[j];
if (i == r - 1) return i;
solve(r, vl[i] - 1);
} else {
int ln = 1;
for (int i = 1; i < vec.size(); i++) {
if (vec[i] != vec[i - 1] + 1) break;
ln++;
}
while (vec.size() > 1) {
ll nk = k;
if (vec.size() == r - i) {
nk = sm;
}
nk = nk / (ln + 1);
r = solve(r, nk);
while (vec.size()) {
if (vec.back() < r) break;
int j = vec.back();
vec.pop_back();
sm -= vl[j];
}
}
vl[i] = sm;
if (i + 1 < r) {
solve(r, vl[i] - 1);
}
}
return i;
}