제출 #1251096

#제출 시각아이디문제언어결과실행 시간메모리
1251096abcdxyz123선물 (IOI25_souvenirs)C++17
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)
{
    /*
    cout<<"+>"<<u<<'\n';
    cout<<sum<<'\n';
    for(int x:cur)cout<<x<<' ';
    cout<<'\n';
    */
    if(cur.size()==1)
    {
        p[u]=sum;
        return ;
    }
    if(p[u]!=-1)return;
    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);
            //if(
               Refresh(sum,cur);
                    //)break;
            //nxt_sum=p[nxt.fi[0]]-1;


    }
}
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...