제출 #1249568

#제출 시각아이디문제언어결과실행 시간메모리
1249568PCTprobabilitySouvenirs (IOI25_souvenirs)C++20
4 / 100
0 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 {
    for(int i=0;i+1<n;i++){
      if(p[i]>=x&&p[i+1]<x&&p[i+1]!=0) return;
    }
    //x 未満の最大の値段を特定したい
    auto f = transaction(x-1);
    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]]-1,self);
    }
    else{
      for(auto e:f.fi) cnt[e]++;
      for(int i=1;i<f.fi.size();i++){
        ll s=x-1-f.se;
        for(int j=i+1;j<f.fi.size();j++) s-=p[j];
        ll v=s/(i+1);
        self(v,self);
      }
    }
  };
  solve(p[0],solve);
  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...