#include "festival.h"
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll inf = 1e15;
std::vector<int> max_coupons(int _A, std::vector<int> _P, std::vector<int> _T) {
int N=(int)_P.size();
ll A=_A;
vector<ll> P(N),T(N);
for(int i=0;i<N;i++) P[i]=_P[i],T[i]=_T[i];
vector<int> ord,pos;
for(int i=0;i<N;i++){
if(T[i]!=1) ord.push_back(i);
else pos.push_back(i);
}
sort(pos.begin(),pos.end(),[&](int i,int j){
return P[i]<P[j];
});
sort(ord.begin(),ord.end(),[&](int i,int j){
return (P[i]*T[i]*T[j]+P[j]*T[j])<(P[j]*T[j]*T[i]+P[i]*T[i]);
});
N=(int)ord.size();
vector<int> res;
bool ok=false;
for(int i=0;i<N;i++){
int id=ord[i];
ll nA=(A-P[id])*T[id];
if(nA<A){
ok=true;
res=vector<int>(ord.begin(),ord.begin()+i);
ord.erase(ord.begin(),ord.begin()+i);
break;
}
else A=nA;
if(A>=inf){
res=ord;
res.insert(res.end(),pos.begin(),pos.end());
return res;
}
}
if(!ok){
res=ord;
ord.clear();
}
int sz=(int)pos.size();
vector<ll> S(sz);
for(int i=0;i<sz;i++){
S[i]=P[pos[i]];
if(i) S[i]+=S[i-1];
}
auto cal = [&](ll X){
return upper_bound(S.begin(),S.end(),X)-S.begin();
};
int LG=32;
N=(int)ord.size();
vector<vector<ll>> dp(N+1,vector<ll>(LG,-inf));
vector<vector<bool>> trace(N+1,vector<bool>(LG,false));
dp[0][0]=A;
for(int i=0;i<N;i++){
int id=ord[i];
for(int j=0;j<LG;j++){
if(dp[i][j]==-inf) continue;
ll X=dp[i][j];
if(X>dp[i+1][j]) dp[i+1][j]=X,trace[i+1][j]=false;
X=(X-P[id])*T[id];
if(X>=0 && X>dp[i+1][j+1]) dp[i+1][j+1]=X,trace[i+1][j+1]=true;
}
}
int mx=0,cj=0;
for(int j=0;j<LG;j++){
ll X=dp[N][j];
if(X==-inf) continue;
int cnt=j+cal(X);
if(cnt>mx) mx=cnt,cj=j;
}
ll X=dp[N][cj];
vector<int> nxt;
for(int i=N;i>=1;i--){
if(trace[i][cj]){
nxt.push_back(ord[i-1]);
cj--;
}
}
reverse(nxt.begin(),nxt.end());
res.insert(res.end(),nxt.begin(),nxt.end());
for(int i=0;i<sz;i++){
if(X>=P[pos[i]]){
X-=P[pos[i]];
res.push_back(pos[i]);
}
}
return res;
}
# | 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... |