#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){
res=transaction(val[i+1]*2LL);
for(auto j:res.first)asked[j]++;
fr[res.first[0]]=val[i+1]*2LL;
query[i]=res;
}
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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |