Submission #1255659

#TimeUsernameProblemLanguageResultExecution timeMemory
1255659TadijaSebezSouvenirs (IOI25_souvenirs)C++20
100 / 100
12 ms420 KiB
#include "souvenirs.h"
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define pb push_back

struct Query{
    vector<int> ids;
    ll sum;

    Query(ll X,pair<vector<int>,ll> res){
        ids=res.first;
        sort(ids.begin(),ids.end());
        sum=X-res.second;
    }
};

void buy_souvenirs(int n, ll P0) {
    vector<int> cnt(n,0);
    vector<ll> P(n);
    P[0]=P0;

    vector<Query> Qs;
    while(true){
        while(true){
            bool upd=false;
            for(Query q:Qs){
                int unk=0,taj;
                ll sum=0;
                for(int i:q.ids){
                    if(P[i]==0)unk++,taj=i;
                    else sum+=P[i];
                }
                if(unk==1){
                    P[taj]=q.sum-sum;
                    upd=true;
                }
            }
            if(!upd)break;
        }

        //for(int i=0;i<n;i++)printf("%lld ",P[i]);
        //printf("\n");

        int ptr=n;
        while(ptr>0&&P[ptr-1]!=0)ptr--;
        if(ptr==0)break;

        ll X=P0-1;
        for(Query q:Qs){
            int lo=0;
            ll sum=0;
            for(int i:q.ids){
                if(i<ptr)lo++;
                else sum+=P[i];
            }
            if(lo){
                if(lo==1){
                    X=min(X,q.sum-sum-1);
                }else{
                    X=min(X,(q.sum-sum)/lo);
                }
            }
        }
        auto res=transaction(X);
        Qs.pb(Query(X,res));
        for(int i:Qs.back().ids){
            cnt[i]++;
        }
    }
    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...