Submission #1261405

#TimeUsernameProblemLanguageResultExecution timeMemory
1261405alexddFestival (IOI25_festival)C++20
100 / 100
96 ms72508 KiB
#include "festival.h" #include <bits/stdc++.h> using namespace std; const int MAXN = 200005; const int LIM = 40; const long long INF = 1e17; long long dp[MAXN][LIM + 1]; int n,init; long long p[MAXN],t[MAXN]; bool cmp(int i, int j) { if(t[i] == 1 && t[j] == 1) return p[i] < p[j]; if(t[i] == 1) return 0; if(t[j] == 1) return 1; return p[i] * t[i] * (t[j] - 1) < p[j] * t[j] * (t[i] - 1); } std::vector<int> max_coupons(int copA, std::vector<int> P, std::vector<int> T) { long long A = copA; n = P.size(); for(int i=0;i<n;i++) { p[i] = P[i]; t[i] = T[i]; } init = A; vector<int> ord; for(int i=0;i<n;i++) ord.push_back(i); sort(ord.begin(),ord.end(),cmp); vector<int> sol,ramase,mici; for(int i:ord) { if((A - p[i]) * t[i] >= A) { sol.push_back(i); A = min(INF, (A - p[i]) * t[i]); } else { if(t[i] == 1) mici.push_back(i); else ramase.push_back(i); } } for(int cnt=0;cnt<=LIM;cnt++) dp[0][cnt] = -1; dp[0][0] = A; for(int i=0;i<ramase.size();i++) { int myt = t[ramase[i]], myp = p[ramase[i]]; dp[i+1][0] = A; for(int cnt=1;cnt<=LIM;cnt++) { dp[i+1][cnt] = max(dp[i][cnt], (dp[i][cnt-1] - myp) * myt); } } long long mxm=-1,unde=-1,u1=-1; long long sum1=0,cnt1=0; for(int cnt=LIM;cnt>=0;cnt--) { if(dp[ramase.size()][cnt] < 0) continue; while(cnt1 < mici.size() && dp[ramase.size()][cnt] - sum1 - p[mici[cnt1]] >= 0) { sum1 += p[mici[cnt1]]; cnt1++; } if(cnt + cnt1 > mxm) { mxm = cnt + cnt1; unde = cnt; u1 = cnt1; } } assert(mxm != -1); long long cur = unde; vector<int> aux; for(int i=(int)ramase.size()-1;i>=0;i--) { if(dp[i+1][cur] == dp[i][cur]) { } else { aux.push_back(ramase[i]); cur--; } } assert(cur == 0); reverse(aux.begin(), aux.end()); for(int x:aux) sol.push_back(x); for(int i=0;i<u1;i++) sol.push_back(mici[i]); return sol; }
#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...