| # | Time | Username | Problem | Language | Result | Execution time | Memory |
|---|---|---|---|---|---|---|---|
| 1302453 | regulardude6 | Souvenirs (IOI25_souvenirs) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
#include "souvenirs.h"
using namespace std;
static int n;
static long long p0;
static vector<long long> pr;
static vector<long long> cnt;
static pair<vector<int>, long long> tr(long long M){
auto res = transaction(M);
for(int x: res.first) cnt[x]++;
return res;
}
static void solve_idx(int i, long long M){
if(i<=0 || i>=n) return;
if(pr[i] != -1) return;
auto res = tr(M);
auto ids = res.first;
long long S = M - res.second;
if(ids.empty()) return;
if(ids[0] != i) i = ids[0];
vector<int> L = ids;
long long sum = S;
while(L.size() > 1){
long long avg = sum / (long long)L.size();
auto res2 = tr(avg);
int j = res2.first.empty() ? -1 : res2.first[0];
int pos = -1;
if(j != -1){
for(int k=0;k<(int)L.size();k++) if(L[k]==j){ pos=k; break; }
}
if(pos == -1){
for(int x: res2.first){
for(int k=0;k<(int)L.size();k++){
if(L[k]==x){ pos=k; j=x; break; }
}
if(pos!=-1) break;
}
}
if(pos == -1) break;
solve_idx(j, avg);
long long suf = 0;
for(int k=pos;k<(int)L.size();k++){
int idx = L[k];
suf += pr[idx];
}
sum -= suf;
L.resize(pos);
}
if(!L.empty()) pr[L[0]] = sum;
}
vector<long long> buy_souvenirs(int N, long long P0){
n = N; p0 = P0;
pr.assign(n, -1);
cnt.assign(n, 0);
pr[0] = p0;
solve_idx(1, p0 - 1);
for(int i=2;i<n;i++){
if(pr[i] == -1) solve_idx(i, pr[i-1] - 1);
}
for(int i=1;i<n;i++){
while(cnt[i] < i) tr(pr[i]);
}
vector<long long> Q(n, 0);
for(int i=0;i<n;i++) Q[i] = cnt[i];
return Q;
}
