Submission #1255818

#TimeUsernameProblemLanguageResultExecution timeMemory
1255818erering선물 (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...