#include <bits/stdc++.h>
#include "festival.h"
using namespace std;
#define pb push_back
#define ll long long
ll tot;
struct info{
ll p,t,i;
friend bool operator<(info a,info b){
ll sc1=(tot-a.p)*a.t;
sc1=(sc1-b.p)*b.t;
ll sc2=(tot-b.p)*b.t;
sc2=(sc2-a.p)*a.t;
return sc1>sc2;
}
};
ll pref[200005],sz;
int score(ll a){
if(sz==0 || a<pref[0])return 0;
if(a>=pref[sz-1])return sz;
int l=0,r=sz-1;
while(l<r){
int mid=(l+r+1)/2;
if(pref[mid]<=a)l=mid;
else r=mid-1;
}
if(pref[l]>a)l--;
return l+1;
}
vector<info> v2;
int pos(ll A, std::vector<pair<int,int>> P[5]) {
v2.clear();
for(int i=0;i<P[2].size();i++)v2.pb({P[2][i].first,2LL,P[2][i].second});
for(int i=0;i<P[3].size();i++)v2.pb({P[3][i].first,3LL,P[3][i].second});
for(int i=0;i<P[4].size();i++)v2.pb({P[4][i].first,4LL,P[4][i].second});
sort(v2.begin(),v2.end());
for(auto j:v2){
A=(A-j.p)*j.t;
if(A<0)return 0;
A=min(A,(long long)1e17);
}
return P[2].size()+P[3].size()+P[4].size()+score(A);
}
std::vector<int> max_coupons(int A, std::vector<int> P, std::vector<int> T) {
vector<info> vec;
tot=A;
for(int i=0;i<T.size();i++)vec.pb({P[i],T[i],i});
sort(vec.begin(),vec.end());
ll rem=A;
vector<int> og;
vector<pair<ll,ll>> v[5];
for(int i=0;i<vec.size();i++){
ll sc=(rem-vec[i].p)*vec[i].t;
if(sc>=1e16){
for(int j=i;j<vec.size();j++)og.pb(vec[j].i);
return og;
}
if(sc>=rem){
rem=sc;
og.pb(vec[i].i);
}
else{
for(int j=i;j<vec.size();j++)v[vec[j].t].pb({vec[j].p,vec[j].i});
break;
}
}
A=rem;
for(int i=0;i<5;i++){
if(!v[i].empty())sort(v[i].begin(),v[i].end());
}
sz=(int)v[1].size();
for(int i=0;i<sz;i++){
pref[i]=v[1][i].first;
if(i>0)pref[i]+=pref[i-1];
}
vector<int> sol;
vector<pair<int,int>> p[5];
for(int j=0;j<=min((int)v[2].size(),60);j++) {
for (int k = 0; k <= min((int)v[3].size(),60); k++) {
for (int l = 0; l <= min((int)v[4].size(),60); l++) {
if (pos(A, p)>sol.size()) {
sol.clear();
for(auto e:v2)sol.pb(e.i);
for(int i=0;i<pos(A,p)-j-k-l;i++)sol.pb(v[1][i].second);
}
if (l != v[4].size()) p[4].pb({v[4][l].first,v[4][l].second});
}
p[4].clear();
if (k != v[3].size()) p[3].pb({v[3][k].first,v[3][k].second});
}
p[3].clear();
if (j != v[2].size())p[2].pb({v[2][j].first,v[2][j].second});
}
for(auto i:sol)og.pb(i);
return og;
}
# | 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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |