Submission #1249577

#TimeUsernameProblemLanguageResultExecution timeMemory
1249577PCTprobability선물 (IOI25_souvenirs)C++20
39 / 100
12 ms412 KiB
#include "souvenirs.h"
#include <utility>
#include <vector>
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define fi first
#define se second
ll p[101];
ll cnt[101];
void buy_souvenirs(int N, long long P0) {
  int n=N;
  p[0]=P0;
  auto solve = [&](ll x,auto self) -> void {
    //cout<<"X"<<" "<<x<<endl;
    for(int i=n-1;i>=0;i--){
      if(p[i]==0) break;
      if(p[i]>=x) return;
    }
    //x 未満の最大の値段を特定したい
    auto f = transaction(x-1);
    /*for(auto e:f.fi) cout<<e<<" ";
    cout<<endl;
    cout<<f.se<<endl;*/
    if(f.fi.size()==1){
      p[f.fi[0]]=x-1-f.se;
      cnt[f.fi[0]]++;
      if(f.fi[0]==n-1) return;
      self(p[f.fi[0]],self);
    }
    else{
      for(auto e:f.fi) cnt[e]++;
      for(int i=f.fi.size()-1;i>=0;i--){
        ll s=x-1-f.se;
        for(int j=i+1;j<f.fi.size();j++) s-=p[f.fi[j]];
        ll v=s/(i+1);
        if(i==0){
          p[f.fi[0]]=v;
          if(f.fi[0]==n-1) return;
          self(p[f.fi[0]],self);
          return;
        }
        self(v+1,self);
      }
    }
  };
  solve(p[0],solve);
  //for(int i=0;i<n;i++) cout<<p[i]<<" ";
  //cout<<endl;
  for(int i=0;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...