Submission #1255379

#TimeUsernameProblemLanguageResultExecution timeMemory
1255379rxlfd314Festival (IOI25_festival)C++20
100 / 100
122 ms123536 KiB
#include "festival.h" #include <bits/stdc++.h> using namespace std; using ll = long long; using ari2 = array<int, 2>; using ari3 = array<int, 3>; using arl2 = array<ll, 2>; using arl3 = array<ll, 3>; template <class T> using vt = vector<T>; #define all(x) begin(x), end(x) #define size(x) (int((x).size())) #define REP(a,b,c,d) for(int a=(b);(d)>0?a<=(c):a>=(c);a+=(d)) #define FOR(a,b,c) REP(a,b,c,1) #define ROF(a,b,c) REP(a,b,c,-1) vt<int> max_coupons(int A, vt<int> P, vt<int> T) { const int N = size(P); vt<arl2> ones; vt<ari3> others; FOR(i, 0, N-1) { if (T[i] == 1) ones.push_back({P[i], i}); else others.push_back({P[i], T[i], i}); } sort(all(ones)); FOR(i, 1, size(ones)-1) ones[i][0] += ones[i-1][0]; sort(all(others), [&](const ari3 &a, const ari3 &b) { return 1ll * a[0] * a[1] * (b[1] - 1) < 1ll * b[0] * b[1] * (a[1] - 1); }); const ll MAX = 2e14; const int LOG = 70; ll cur = A; vt<int> ret; int start = -1; FOR(ii, 0, size(others)-1) { const auto [p, t, i] = others[ii]; if ((cur - p) * t >= cur) { ret.push_back(i); cur = min(MAX, (cur - p) * t); } else { start = ii; break; } } if (start >= 0) { vt<vt<ll>> dp(size(others) + 1, vt<ll>(LOG + 1, -1)); dp[start][0] = cur; FOR(i, start+1, size(others)) { const auto [p, t, _] = others[i-1]; dp[i][0] = cur; FOR(j, 1, LOG) { dp[i][j] = max(dp[i-1][j], 1ll * (dp[i-1][j-1] - p) * t); } } ari2 best = {0, 0}; FOR(i, 0, LOG) { if (dp.back()[i] < 0) break; const int j = lower_bound(all(ones), arl2{dp.back()[i] + 1, -1}) - ones.begin(); best = max(best, ari2{i + j, i}); } const int b = best[1]; int x = b; vt<int> sus; ROF(i, size(dp)-1, start+1) { const auto [p, t, ind] = others[i-1]; if (dp[i][x] == 1ll * (dp[i-1][x-1] - p) * t) { x--; sus.push_back(ind); } } reverse(all(sus)); ret.insert(ret.end(), all(sus)); const int M = lower_bound(all(ones), arl2{dp.back()[b] + 1, -1}) - ones.begin(); FOR(i, 0, M-1) ret.push_back(ones[i][1]); } else { const int M = lower_bound(all(ones), arl2{cur + 1, -1}) - ones.begin(); FOR(i, 0, M-1) ret.push_back(ones[i][1]); } return ret; }
#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...