# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1266958 | imarn | Festival (IOI25_festival) | C++20 | 0 ms | 0 KiB |
//#include "festival.h"
#include<bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC target("avx2")
#define ll long long
#define ld long double
#define pii pair<int,int>
#define pll pair<ll,ll>
#define plx pair<ll,int>
#define f first
#define s second
#define pb push_back
#define all(x) x.begin(),x.end()
#define vi vector<int>
#define vvi vector<vi>
#define ub(x,i) upper_bound(all(x),i)-x.begin()
#define lb(x,i) lower_bound(all(x),i)-x.begin()
#define sz(x) (ll)x.size()
#define cd complex<double>
#define t3 tuple<ll,ll,ll>
using namespace std;
const int mxn=5e5+5,mxk=61;
vector<ll>qs,a,t,v,ord;
int n;
ll dp[mxn][mxk]{0};
ll pr[mxn][mxk]{0};
ll cal(ll x,int i){
return min((ll)1e15,t[i]*(x-a[i]));
}
bool cmp(int i,int j){
return a[i]*t[i]*(t[j]-1)<=a[j]*t[j]*(t[i]-1);
}
bool cmp2(int i,int j){
return a[i]<a[j];
}
std::vector<int>max_coupons(int A, std::vector<int> P,std::vector<int> T){
n=P.size();for(auto it:P)a.pb(it);for(auto it:T)t.pb(it);
for(int i=0;i<n;i++){
if(t[i]==1)qs.pb(a[i]),ord.pb(i);
else v.pb(i);
}sort(all(qs));for(int i=1;i<qs.size();i++)qs[i]+=qs[i-1];
sort(all(v),cmp);sort(all(ord),cmp2);
ll cur=A;vector<int>ans;
for(auto it : v){
if(cur<=cal(cur,it)){cur=cal(cur,it);ans.pb(it);}
else break;
}
if(ans.size()==v.size()){
int idx=ub(qs,cur);
for(int i=0;i<idx;i++)ans.pb(ord[i]);
return ans;
}int l=ans.size(),r=v.size();
dp[l][0]=cur;
for(int i=1;i<mxk;i++)dp[l][i]=-1;
for(int i=l+1;i<=r;i++){
dp[i][0]=dp[i-1][0];
for(int j=1;j<mxk;j++){
dp[i][j]=dp[i-1][j];pr[i][j]=j;
if(dp[i-1][j-1]!=-1&&cal(dp[i-1][j-1],v[i-1])>=dp[i][j])dp[i][j]=cal(dp[i-1][j-1],v[i-1]),pr[i][j]=j-1;
}
}int mx=0,mem=-1;
for(int i=mxk-1;i>=0;i--){
if(dp[r][i]>=0&&mx<(int)ans.size()+i+ub(qs,dp[r][i]))mx=(int)ans.size()+i+ub(qs,dp[r][i]),mem=i;
}int cr=r,mem2=mem;stack<int>st;
while(mem>0){
if(pr[cr][mem]!=mem)st.push(v[cr-1]),mem--;
cr--;
}while(!st.empty())ans.pb(st.top()),st.pop();
int idx=ub(qs,dp[r][mem2]);
for(int i=0;i<idx;i++)ans.pb(ord[i]);
return ans;
}
int main(){
ios_base::sync_with_stdio(0);cin.tie(0);
vector<int>x=max_coupons(20,{2,5,7,2,3,4,4,6,7,10},{4,3,1,3,2,1,4,2,2});
for(auto it : x)cout<<it<<' ';
}