P13535 [IOI 2025] 纪念品(souvenirs)
题目背景
不要 $\texttt{\#include "souvenirs.h"}$。
你需要在文件头加入以下内容,并**使用 $\texttt{\textcolor{red}{C++\,20}}$ 提交**:
```cpp
#include
#include
std::pair transaction(long long M);
```
题目描述
Amaru 在一家国外商店购买纪念品。商店有 $N$ **种**纪念品,而且每种纪念品有无限多件现货。
每种纪念品都有一个固定的价格:第 $i$ 种($0 \leq i < N$)纪念品的价格为 $P[i]$ 枚硬币,其中 $P[i]$ 是一个正整数。
Amaru 知道纪念品种类是按价格降序排列的,而且所有纪念品的价格互不相同。具体来说,$P[0] > P[1] > \cdots > P[N-1] > 0$。此外,他还知道 $P[0]$ 的值。不幸的是,Amaru 没有其他纪念品的价格信息。
为了购买纪念品,Amaru 会与卖家进行若干次交易。
每次交易由以下步骤组成:
1. Amaru 向卖家支付一定数量(正数)的硬币。
1. 卖家将这些硬币堆放在商店后台的桌子上,因此 Amaru 无法看到这些硬币。
1. 卖家按顺序依次处理每种纪念品 $0, 1, \ldots, N-1$。每种纪念品在每次交易中被处理**恰好一次**。
* 当处理第 $i$ 种纪念品时,如果当前硬币堆中的硬币数量至少为 $P[i]$,则
* 卖家从硬币堆中移除 $P[i]$ 枚硬币;
* 卖家将一件第 $i$ 种纪念品放在桌子上。
4. 卖家将剩余的所有硬币和桌子上的纪念品交给 Amaru。
注意,在每次交易开始前,桌上没有任何硬币或纪念品。
你的任务是指导 Amaru 进行若干次交易,使得:
* 在每次交易中,他购买**至少一件**纪念品;
* 总体上他**恰好**购买了 $i$ 件第 $i$ 种纪念品,其中 $0 \leq i < N$。注意,这意味着 Amaru 不应购买第 $0$ 种纪念品。
Amaru 不需要最小化交易次数,而且拥有无限量的硬币供应。
### 实现细节
你需要实现以下函数。
```
void buy_souvenirs(int N, long long P0)
```
* $N$:纪念品的种数。
* $P0$:$P[0]$ 的值。
* 对每个测试用例,该函数恰被调用一次。
上述函数可以调用以下函数,来指导 Amaru 进行交易:
```
std::pair transaction(long long M)
```
* $M$:Amaru 支付给卖家的硬币数量。
* 该函数返回一对元素。第一个元素是数组 $L$,包含按顺序排列的已购买的纪念品种类。第二个元素是整数 $R$,表示交易后卖家返还给 Amaru 的硬币数量。
* 要求 $P[0] > M \geq P[N-1]$。条件 $P[0] > M$ 确保 Amaru 不购买第 $0$ 种纪念品,而条件 $M \geq P[N-1]$ 确保他至少购买一件纪念品。如果这些条件未被满足,你将收到 `Output isn't correct: Invalid argument`。注意,与 $P[0]$ 不同,$P[N-1]$ 的值未在输入中提供。
* 对每个测试用例,该函数最多被调用 $5000$ 次。
评测程序的行为是**非自适应的**。
这意味着在调用 `buy_souvenirs` 前,价格序列 $P$ 是固定的。
输入格式
```
N
P[0] P[1] ... P[N-1]
```
输出格式
输出格式:
```
Q[0] Q[1] ... Q[N-1]
```
这里,对每个满足 $0 \leq i < N$ 的 $i$,购买的第 $i$ 种纪念品的数量为 $Q[i]$。
说明/提示
### 例子
考虑以下函数调用。
```
buy_souvenirs(3, 4)
```
共有 $N = 3$ 种纪念品,且 $P[0] = 4$。观察到只有三种可能的价格序列 $P$:$[4, 3, 2]$,$[4, 3, 1]$ 和 $[4, 2, 1]$。
假设 `buy_souvenirs` 调用 `transaction(2)`,且函数返回 $([2], 1)$,表示 Amaru 购买了一件第 $2$ 种纪念品,而且卖家返还了 $1$ 枚硬币。通过观察,我们可以推断出 $P = [4, 3, 1]$,因为:
* 对于 $P = [4, 3, 2]$,`transaction(2)` 会返回 $([2], 0)$。
* 对于 $P = [4, 2, 1]$,`transaction(2)` 会返回 $([1], 0)$。
然后 `buy_souvenirs` 可以调用 `transaction(3)` 返回 $([1], 0)$,表示 Amaru 购买了一件第 $1$ 种纪念品,而卖家返还了 $0$ 枚硬币。到目前为止,Amaru 购买了一件第 $1$ 种纪念品和一件第 $2$ 种纪念品。
最后,`buy_souvenirs` 可以调用 `transaction(1)` 返回 $([2], 0)$,表示 Amaru 购买了一件第 $2$ 种纪念品。注意,这里也可以调用 `transaction(2)`。至此,Amaru 共购买了一件第 $1$ 种纪念品和两件第 $2$ 种纪念品,符合要求。
### 约束条件
* $2 \leq N \leq 100$
* 对每个满足 $0 \leq i < N$ 的 $i$,有 $1 \leq P[i] \leq 10^{15}$ 。
* 对每个满足 $0 \leq i < N - 1$ 的 $i$,有 $P[i] > P[i+1]$ 。
### 子任务
| 子任务 | 分数 | 额外的约束条件 |
| :-----: | :----: | ---------------------- |
| 1 | $4$ | $N = 2$
| 2 | $3$ | 对每个满足 $0 \leq i < N$ 的 $i$,有 $P[i] = N - i$。
| 3 | $14$ | 对每个满足 $0 \leq i < N - 1$ 的 $i$,有 $P[i] \leq P[i+1] + 2$。
| 4 | $18$ | $N = 3$
| 5 | $28$ | 对每个满足 $0 \leq i < N-2$ 的 $i$,有 $P[i+1] + P[i+2] \leq P[i]$。对每个满足 $0 \leq i < N-1$ 的 $i$,有 $P[i] \leq 2 \cdot P[i+1]$。
| 6 | $33$ | 没有额外的约束条件。