Submission #1251105

#TimeUsernameProblemLanguageResultExecution timeMemory
1251105abcdxyz123Souvenirs (IOI25_souvenirs)C++20
100 / 100
12 ms420 KiB
#include "souvenirs.h"
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define vi vector<int>
#define fi first
#define se second
vector<ll>p;
vector<int>cnt;
int Refresh(ll &sum,vector<int>&cur)
{
    int old=cur.size();
    set<int>s;
    for(int v:cur)
    {
        s.insert(v);
    }
    for(int v:cur)
    {
        if(p[v]!=-1)
        {
            sum-=p[v];
            s.erase(v);
        }
    }
    cur.clear();
    for(int v:s)cur.push_back(v);
    return (old>cur.size());
}
void dfs(int u,ll sum,vector<int>cur)
{
    if(cur.size()==1)
    {
        p[u]=sum;
        return ;
    }
    if(p[u]!=-1)assert(0);
    Refresh(sum,cur);
    while(true)
    {
        if(cur.size()==1)
        {
            p[u]=sum;
            break;
        }
        ll nxt_sum=sum/cur.size();
        for(int i=cur.back(); i>=u; i--)
        {
            if(p[i]!=-1)
            {
                nxt_sum=p[i]-1;
                break;
            }
        }
        pair<vi,ll>nxt=transaction(nxt_sum);
        for(int v:nxt.fi)cnt[v]++;
        nxt_sum-=nxt.se;
        dfs(nxt.fi[0],nxt_sum,nxt.fi);
        Refresh(sum,cur);
    }
}
void buy_souvenirs(int n,ll p0)
{
    p=vector<ll>(n,-1);
    p[0]=p0;
    cnt=vector<int>(n,0);
    for(int i=1; i<n; i++)
    {
        if(p[i]==-1)
        {
            ll nxt_sum=p[i-1]-1;
            pair<vi,ll>nxt=transaction(nxt_sum);
            for(int v:nxt.fi)cnt[v]++;
            nxt_sum-=nxt.se;
            Refresh(nxt_sum,nxt.fi);
            dfs(nxt.fi[0],nxt_sum,nxt.fi);
        }
    }
    for(int i=1; i<n; i++)
    {
        while(cnt[i]<i)
        {
            transaction(p[i]);
            cnt[i]++;
        }
    }
}
#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...