제출 #1266966

#제출 시각아이디문제언어결과실행 시간메모리
1266966imarn축제 (IOI25_festival)C++20
66 / 100
1094 ms168056 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=2e5+5,mxk=51; 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){ if(i>=t.size())return 0; return min((ll)1e15,t[i]*(x-a[i])); } bool cmp(int i,int j){ if(i>=t.size()||j>=t.size())return 0; return a[i]*t[i]*(t[j]-1)<=a[j]*t[j]*(t[i]-1); } bool cmp2(int i,int j){ //if(i>=t.size()||j>=t.size())return 0; 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; }int l=max((int)ans.size(),0),r=min((int)v.size(),mxn-5); 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&&cr>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][max(mem2,0)]); for(int i=0;i<idx;i++)ans.pb(ord[i]); return ans; } /*int main(){ ios_base::sync_with_stdio(0);cin.tie(0); }*/
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...