// solution/isaac_pruning_full.cpp
// {
//   "verdict": "correct"
// }
// END HEADER
#include "festival.h"
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = 1e18;
vector<int> cur, best;
int best_type1;
void solve(int pos, ll tokens, int lim, 
           vector<int> &a, vector<pair<ll, int> > &b, vector<int> &p, vector<int> &t) {
    if (lim == 1 || pos == a.size()) {
        auto it = lower_bound(b.begin(), b.end(), make_pair(tokens + 1, -1)) - b.begin();
        if (it + cur.size() > best.size() + best_type1) {
            best = cur;
            best_type1 = it;
        }
        return;
    }
    if (tokens >= p[a[pos]] && lim >= t[a[pos]]) {
        cur.push_back(a[pos]);
        solve(pos + 1, min((tokens - p[a[pos]]) * t[a[pos]], INF), lim, a, b, p, t);
        cur.pop_back();
    }
    solve(pos + 1, tokens, min(lim, t[a[pos]] - 1), a, b, p, t);
}
vector<int> max_coupons(int A, vector<int> P, vector<int> T) {
    vector<int> a;
    vector<pair<ll, int> > b;
    int n = P.size();
    for (int i = 0; i < n; i++) {
        if (T[i] > 1) a.push_back(i);
        else b.push_back({P[i], i});
    }
    sort(a.begin(), a.end(), [&](int i, int j) {
        if (T[i] == T[j]) return P[i] < P[j];
        return 1ll * P[i] * T[i] * (T[j] - 1) < 1ll * P[j] * T[j] * (T[i] - 1);
    });
    sort(b.begin(), b.end());
    for (int i = 1; i < b.size(); i++) {
        b[i].first += b[i - 1].first;
    }
    vector<int> res;
    ll curTokens = A;
    for (auto i: a) {
        if ((curTokens - P[i]) * T[i] >= curTokens) {
            curTokens = (curTokens - P[i]) * T[i];
            curTokens = min(curTokens, (long long) 1e15);
            res.push_back(i);
        } else {
            break;
        }
    }
    a.erase(a.begin(), a.begin() + (int) res.size());
    solve(0, curTokens, 4, a, b, P, T);
    for (auto i: best) {
        res.push_back(i);
    }
    for (int i = 0; i < best_type1; i++) {
        res.push_back(b[i].second);
    }
    return res;
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |