제출 #1262065

#제출 시각아이디문제언어결과실행 시간메모리
1262065garam1732축제 (IOI25_festival)C++20
100 / 100
62 ms12984 KiB
#include "festival.h" #include <bits/stdc++.h> using namespace std; #define ff first #define ss second #define bl ' ' #define endl '\n' #define all(v) (v).begin(), (v).end() #define comp(v) (v).erase(unique(all(v)), (v).end()) #define lbd(v,x) lower_bound(all(v), (x))-(v).begin() #define ubd(v,x) upper_bound(all(v), (x))-(v).begin() typedef long long ll; typedef pair<int, int> pi; typedef pair<pi, int> pii; typedef pair<int, pi> ipi; typedef pair<pi, pi> pipi; typedef pair<ll, ll> pll; const int MAXN = 100100*2; const ll MOD = 1e9+7; const ll INF = 1e15; struct Coupon { ll p, t, n; bool operator < (const Coupon& x) const { if((t==1)^(x.t==1)) return x.t==1; if(t==1) return p<x.p; return p*t*(x.t-1) < x.p*x.t*(t-1); } } arr[MAXN]; vector<int> lst[5]; const int MAXM = 50; ll dp[MAXM][MAXM][MAXM]; ll sum[MAXN]; vector<int> res, res1; std::vector<int> max_coupons(int A, std::vector<int> P, std::vector<int> T) { int n = P.size(); for(int i=0; i<n; i++) arr[i] = {P[i],T[i], i}; sort(arr, arr+n); int idx=0; ll cur=A; while(idx<n && cur<INF) { if((cur-arr[idx].p)*arr[idx].t < cur) break; res.push_back(idx); cur = arr[idx].t*(cur-arr[idx].p); idx++; } if(cur>=INF) { while(idx<n) res.push_back(idx++); for(auto &x:res) x=arr[x].n; return res; } for(int t=1;t<=4;t++) lst[t] = {-1}; for(int i=idx;i<n;i++) { lst[arr[i].t].push_back(i); } int sz=lst[1].size(); for(int i=1; i<sz; i++) sum[i]=sum[i-1]+arr[lst[1][i]].p; memset(dp, -1, sizeof dp); pair<int, vector<int> > mx = make_pair(0, vector<int>{0}); for(int i=0;i<MAXM&&i<lst[2].size();i++) { for(int j=0;j<MAXM&&j<lst[3].size();j++) { for(int k=0;k<MAXM&&k<lst[4].size();k++) { if(!i && !j && !k) { dp[i][j][k] = cur; } else { int x = max(max(lst[2][i], lst[3][j]), lst[4][k]); int di = (lst[2][i]==x), dj = (lst[3][j]==x), dk = (lst[4][k]==x); if(dp[i-di][j-dj][k-dk] >= arr[x].p) { dp[i][j][k] = arr[x].t*(dp[i-di][j-dj][k-dk]-arr[x].p); } } if(dp[i][j][k] != -1) { int it = upper_bound(sum, sum+sz, dp[i][j][k])-sum-1; mx = max(mx, make_pair(i+j+k+it, vector<int>{i,j,k,it})); } } } } vector<int> v=mx.ss; for(int t=1;t<=v[0];t++) res.push_back(lst[2][t]); for(int t=1;t<=v[1];t++) res.push_back(lst[3][t]); for(int t=1;t<=v[2];t++) res.push_back(lst[4][t]); for(int t=1;t<=v[3];t++) res.push_back(lst[1][t]); sort(all(res)); for(auto &x:res) x=arr[x].n; return res; }
#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...