Submission #1251079

#TimeUsernameProblemLanguageResultExecution timeMemory
1251079abcdxyz123Souvenirs (IOI25_souvenirs)C++17
39 / 100
12 ms412 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)
{
    /*
    cout<<"+>"<<u<<'\n';
    cout<<sum<<'\n';
    for(int x:cur)cout<<x<<' ';
    cout<<'\n';
    */
    if(cur.size()==1)
    {
        p[u]=sum;
        return ;
    }
    Refresh(sum,cur);
    while(true)
    {
        ll nxt_sum=sum/cur.size();
        while(true)
        {
            pair<vi,ll>nxt=transaction(nxt_sum);
            for(int v:nxt.fi)cnt[v]++;
            dfs(nxt.fi[0],nxt_sum-nxt.se,nxt.fi);
            if(Refresh(sum,cur))break;
            nxt_sum=p[nxt.fi[0]]-1;
        }
        if(cur.size()==1)
        {
            p[u]=sum;
            break;
        }
    }
}
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...