P13538 [IOI 2025] Festival

Description

Nayra is at a festival playing a game where the grand prize is a trip to Laguna Colorado. The game consists of using tokens to buy coupons. Buying a coupon may result in additional tokens. The goal is to get as many coupons as possible. She starts the game with $A$ tokens. There are $N$ coupons, numbered from $0$ to $N - 1$. Nayra has to pay $P[i]$ tokens ($0 \leq i < N$) to buy coupon $i$ (and she must have at least $P[i]$ tokens before the purchase). She can buy each coupon at most once. Moreover, each coupon $i$ ($0 \leq i < N$) is assigned a **type**, denoted by $T[i]$, which is an integer **between $1$ and $4$**, inclusive. After Nayra buys coupon $i$, the remaining number of tokens she has gets multiplied by $T[i]$. Formally, if she has $X$ tokens at some point of the game, and buys coupon $i$ (which requires $X \geq P[i]$), then she will have $(X - P[i]) \cdot T[i]$ tokens after the purchase. Your task is to determine which coupons Nayra should buy and in what order, to maximize the total number of **coupons** she has at the end. If there is more than one sequence of purchases that achieves this, you may report any one of them. ### Implementation Details You should implement the following procedure: ```cpp std::vector max_coupons(int A, std::vector P, std::vector T) ``` - $A$: the initial number of tokens Nayra has. - $P$: an array of length $N$ specifying the prices of the coupons. - $T$: an array of length $N$ specifying the types of the coupons. - This procedure is called exactly once for each test case. The procedure should return an array $R$, which specifies Nayra's purchases as follows: - The length of $R$ should be the maximum number of coupons she can buy. - The elements of the array are the indices of the coupons she should buy, in chronological order. That is, she buys coupon $R[0]$ first, coupon $R[1]$ second, and so on. - All elements of $R$ must be unique. If no coupons can be bought, $R$ should be an empty array.

Input Format

Input format: ``` N A P[0] T[0] P[1] T[1] ... P[N-1] T[N-1] ```

Output Format

Output format: ``` S R[0] R[1] ... R[S-1] ``` Here, $S$ is the length of the array $R$ returned by `max_coupons`.

Explanation/Hint

### Example 1 Consider the following call. ```cpp max_coupons(13, [4, 500, 8, 14], [1, 3, 3, 4]) ``` Nayra initially has $A = 13$ tokens. She can buy 3 coupons in the order shown below: | Coupon bought | Coupon price | Coupon type | Number of tokens after the purchase | | :-: | :-: | :-: | :-: | | 2 | 8 | 3 | $(13 - 8) \cdot 3 = 15$ | | 3 | 14 | 4 | $(15 - 14) \cdot 4 = 4$ | | 0 | 4 | 1 | $(4 - 4) \cdot 1 = 0$ | In this example, it is not possible for Nayra to buy more than 3 coupons, and the sequence of purchases described above is the only way in which she can buy 3 of them. Hence, the procedure should return $[2, 3, 0]$. ### Example 2 Consider the following call. ```cpp max_coupons(9, [6, 5], [2, 3]) ``` In this example, Nayra can buy both coupons in any order. Hence, the procedure should return either $[0, 1]$ or $[1, 0]$. ### Example 3 Consider the following call. ```cpp max_coupons(1, [2, 5, 7], [4, 3, 1]) ``` In this example, Nayra has one token, which is not enough to buy any coupons. Hence, the procedure should return $[]$ (an empty array). ### Constraints - $1 \leq N \leq 200000$ - $1 \leq A \leq 10^9$ - $1 \leq P[i] \leq 10^9$ for each $i$ such that $0 \leq i < N$. - $1 \leq T[i] \leq 4$ for each $i$ such that $0 \leq i < N$. ### Subtasks | Subtask | Score | Additional Constraints | | :-: | :-: | :-: | | 1 | 5 | $T[i] = 1$ for each $i$ such that $0 \leq i < N$. | | 2 | 7 | $N \leq 3000; T[i] \leq 2$ for each $i$ such that $0 \leq i < N$. | | 3 | 12 | $T[i] \leq 2$ for each $i$ such that $0 \leq i < N$. | | 4 | 15 | $N \leq 70$ | | 5 | 27 | Nayra can buy all $N$ coupons (in some order). | | 6 | 16 | $(A - P[i]) \cdot T[i] < A$ for each $i$ such that $0 \leq i < N$. | | 7 | 18 | No additional constraints. |