| # | Time | Username | Problem | Language | Result | Execution time | Memory |
|---|---|---|---|---|---|---|---|
| 1307797 | exoworldgd | Souvenirs (IOI25_souvenirs) | C++20 | 0 ms | 0 KiB |
#pragma GCC optimize("Ofast,unroll-loops,inline,fast-math,omit-frame-pointer")
#pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt,tune=native,fma")
#include <bits/stdc++.h>
#include "souvenirs.h"
#define exoworldgd cin.tie(0)->sync_with_stdio(0),cout.tie(0)
using namespace std;
const int N=1e5+5;
int n,cost[N],cnt[N];
void rec(int idx,int budget){
if(idx>=n||cost[idx]^-1)return;
auto res=transaction(budget-1);
if(res.first.empty())return;
int cur=res.first.front();
for(auto e:res.first)cnt[e]++;
if(res.first.size()>1){
int rem=budget-1-res.second,per=rem/res.first.size()+1;
for(int i=res.first.size()-1;i>0;i--)~cost[res.first[i]]||rec(res.first[i],per),res.second+=cost[res.first[i]];
}
cost[cur]=budget-1-res.second,rec(cur+1,cost[cur]);
}
void buy_souvenirs(int N,int P){
n=N;
for(int i=0;i<n;i++)cost[i]=-1,cnt[i]=0;
cost[0]=P,rec(1,P);
for(int i=0;i<n;i++)while(cnt[i]<i)cnt[i]++,transaction(cost[i]);
}
