Submission #1255818

#TimeUsernameProblemLanguageResultExecution timeMemory
1255818ereringSouvenirs (IOI25_souvenirs)C++20
100 / 100
11 ms420 KiB
#include <bits/stdc++.h>
#include "souvenirs.h"
#include <utility>
#include <vector>
using namespace std;
#define ll long long
void buy_souvenirs(int N, long long P0) {
    std::pair<std::vector<int>, long long> res = transaction(P0-1);
    ll asked[N],fr[N];
    pair<vector<int>,long long> query[N];
    for(int i=0;i<N;i++){
        asked[i]=0; query[i].second=-1;
    }
    for(auto i:res.first)asked[i]++;
    query[res.first[0]]=res;
    ll last=P0-1;
    fr[res.first[0]]=last;
    while(res.first.size()>1 || res.first[0]!=N-1){
        ll sum=last-res.second,cnt=res.first.size();
        if(cnt==1){
            res=transaction(sum-1);
            last=sum-1;
        }
        else{
            res=transaction(sum/cnt);
            last=sum/cnt;
        }
        for(auto i:res.first)asked[i]++;
        query[res.first[0]]=res;
        fr[res.first[0]]=last;
    }
    ll val[N];
    val[N-1]=last-res.second;
    for(int i=N-2;i>0;i--){
        if(query[i].second==-1){
            for(int j=i-1;j>=0;j--){
                if(query[j].second!=-1){
                    res=query[j];
                    last=fr[j];
                    break;
                }
            }
            while(res.first[0]!=i){
                ll sum=last-res.second,cnt=res.first.size();
                for(auto j:res.first){
                    if(j>i){
                        sum-=val[j];
                        cnt--;
                    }
                }
                if(cnt==1){
                    res=transaction(sum-1);
                    last=sum-1;
                }
                else{
                    res=transaction(sum/cnt);
                    last=sum/cnt;
                }
                for(auto j:res.first)asked[j]++;
                query[res.first[0]]=res;
                fr[res.first[0]]=last;
            }
        }
        ll sum=fr[i]-query[i].second;
        for(int j=1;j<query[i].first.size();j++)sum-=val[query[i].first[j]];
        val[i]=sum;
    }
    for(int i=0;i<N;i++){
        for(int j=(int)asked[i]+1;j<=i;j++)transaction(val[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...