Submission #1306051

#TimeUsernameProblemLanguageResultExecution timeMemory
1306051StefanSebezSouvenirs (IOI25_souvenirs)C++20
100 / 100
14 ms792 KiB
#include "souvenirs.h"
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ll long long
#define ld long double
const int N=150,inf=1e9;
const ll INF=1e18;
int num[N],n;
ll val[N];
vector<pair<vector<int>,ll>>Qs;
ll Ask(ll x){
    //printf("%i\n",x);
    pair<vector<int>,ll>y=transaction(x);
    //int temp[n+10]={0};
    //for(auto i:y.fi)temp[i]=1;
    //for(int i=0;i<n;i++) printf("%i ",temp[i]);printf("\n");
    Qs.pb({y.fi,x-y.se});
    for(auto i:y.fi)num[i]++;
    return Qs.back().se;
}
ll Sum(int j){
    ll x=Qs[j].se;
    for(auto i:Qs[j].fi)if(val[i])x-=val[i];
    return x;
}
int Cnt(int j){
    int x=Qs[j].fi.size();
    for(auto i:Qs[j].fi)if(val[i])x--;
    return x;
}
int Mx(int j){
    int mx=0;
    for(auto i:Qs[j].fi)if(!val[i])mx=max(mx,i);
    return mx;
}

void Clear(){
    Qs.clear();
    for(int i=0;i<=n;i++)num[i]=val[i]=0;
    n=0;
}
void buy_souvenirs(int n1,ll P0){
    n=n1;
    Ask(P0-1);
    for(int I=n-1;I>=1;I--){
        //printf("* %i\n",I);
        ll mn=INF;int j=0;
        for(int i=0;i<Qs.size();i++)if(Cnt(i)!=0){
            ll x=Sum(i)/Cnt(i)-1;
            if(Mx(i)==I)x++;
            //printf("{%i %lld}\n",i,x);
            if(mn>x||(mn==x&&Cnt(i)<Cnt(j)))mn=x,j=i;
        }
        //printf("%i\n",j);
        while(!(Cnt(j)==1&&Mx(j)==I)){
            ll x=Sum(j)/Cnt(j)-1;
            if(Mx(j)==I)x++;
            Ask(x);
            j=Qs.size()-1;
        }
        val[I]=Sum(j);
    }
    //printf("dopuna\n");
    for(int i=1;i<n;i++){
        while(num[i]<i)Ask(val[i]);
    }

    Clear();
}
#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...