제출 #1254870

#제출 시각아이디문제언어결과실행 시간메모리
1254870PenguinsAreCute축제 (IOI25_festival)C++20
100 / 100
98 ms60048 KiB
#include "festival.h" #include <bits/stdc++.h> using namespace std; std::vector<int> max_coupons(int A, std::vector<int> P, std::vector<int> T) { long long B = A; vector<int> val1; vector<long long> pre1 = {0}; vector<int> rem; for(int i=0;i<(int)P.size();i++) { if(T[i] == 1) val1.push_back(i); else rem.push_back(i); } sort(val1.begin(),val1.end(), [&P](int x, int y) {return P[x] < P[y];}); for(auto i: val1) pre1.push_back(pre1.back()+P[i]); sort(rem.begin(),rem.end(),[&P,&T](int x, int y) { return 1LL * P[x] * T[x] * (T[y] - 1) < 1LL * P[y] * T[y] * (T[x] - 1); }); vector<int> impt; vector<int> ans, mid; for(auto i: rem) { if(1LL * T[i] * (B - P[i]) >= B) { B = min(1LL<<60, 1LL * T[i] * (B - P[i])); ans.push_back(i); } else impt.push_back(i); } int N = impt.size(); long long dp[N+1][35]; memset(dp,-1,sizeof(dp)); dp[0][0] = B; for(int i=0;i<N;i++) { for(int j=0;j<35;j++) dp[i+1][j] = dp[i][j]; for(int j=0;j<34;j++) dp[i+1][j+1] = max(dp[i+1][j+1],1LL * T[impt[i]] * (dp[i][j] - P[impt[i]])); } pair<int,int> bst = {-1,-1}; for(int j=0;j<35;j++) if(dp[N][j] >= 0) { int cnt = upper_bound(pre1.begin(),pre1.end(),dp[N][j]) - pre1.begin() - 1; bst = max(bst, {j+cnt, j}); } int j = bst.second; int cnt = upper_bound(pre1.begin(),pre1.end(),dp[N][j]) - pre1.begin() - 1; for(int i=N;i--;) { if(dp[i+1][j] != dp[i][j]) { mid.push_back(impt[i]); j--; } } reverse(mid.begin(),mid.end()); for(auto i: mid) ans.push_back(i); for(int i=0;i<cnt;i++) ans.push_back(val1[i]); return ans; }
#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...