P14718 [RMI 2025] 松鼠 / Squirrel

题目描述

一只松鼠发现了一个存放坚果的储藏室。 储藏室包含 $N$ 行房间,编号从 $0$ 到 $N-1$。 索引为 $i$ 的一行包含 $i+1$ 个房间,编号从 $0$ 到 $i$。 位于第 $i$ 行第 $j$ 列的房间包含 $A_{ij}$ 个坚果。 在 $\frac{N \times (N+1)}{2}$ 个房间中,数 $A_{ij}$ 两两不同,且取值在 $1$ 到 $\frac{N \times (N+1)}{2}$ 之间。 形式化地说,储藏室的形状是一个三角形半矩阵,即主对角线下方(包含主对角线)的那一部分,其中每个元素表示坚果数量。 这个半矩阵中的数是从 $1$ 到 $\frac{N \times (N+1)}{2}$ 的所有整数,每个数恰好出现一次。 例如,当 $N = 5$ 时,储藏室会有 15 个房间,包含从 1 到 15 的数字。 这种储藏室的一个例子可以是下面所示的半矩阵: ::::align{center} ![](https://cdn.luogu.com.cn/upload/image_hosting/7tusl2qo.png) :::: 松鼠沿着主对角线行走,并且在位于 $(i, i)$ 的每个房间,它会选择一个位于以 $(i, i)$ 为右上角、以 $(N-1, 0)$ 为左下角的矩形中的房间,并吃掉该房间里的橡实。 在上面的例子中,当松鼠位于 $(1, 1)$ 时,它可以选择吃掉红色标出的 8 个房间中的任意一个房间里的坚果。 当它走过主对角线上的所有房间并且恰好吃了 $N$ 个不同房间里的坚果后,松鼠心满意足地离开。 要求:给定 $N$ 以及对任意 $0 \le i < N$ 和 $0 \le j \le i$ 的 $A_{ij}$,求松鼠最多能吃到多少坚果。 同时,对于它访问的 $N$ 个房间中的每一个,求松鼠所吃的坚果数量。 ### 实现细节 这是一道(函数式)交互题。你不需要,也不应该定义 `main` 函数。 你需要实现函数 ```cpp void solve(int N, vector A, long long& answer, vector& solution) ``` 函数参数: 输入数据: * `int N`:储藏室大小 / 行数 * `vector A`:每个房间中的坚果数量(更准确地说,在 $A_{ij}$ 中,$0 \le i < N$ 且 $0 \le j \le i$,你会找到第 $i$ 行第 $j$ 个位置的房间中的坚果数量) 输出数据: * `long long &answer`:将包含松鼠走过对角线上的全部 $N$ 个房间后能够吃到的最大坚果数量。 * `vector &solution`:一个 `vector`,包含松鼠在每个房间中吃到的坚果数量。(更准确地说,$solution_i$ 且 $0 \le i < N$ 表示松鼠位于房间 $(i,i)$ 时吃到的坚果数量) **注意**:对于 $A$ 和 $solution$,下标从 $0$ 开始,并且 $solution$ 的大小应当恰好为 $N$。

输入格式

见「实现细节」。

输出格式

见「实现细节」。

说明/提示

### 约束 * $1 \le N \le 2000$ * $1 \le A_{ij} \le \frac{N \times (N+1)}{2}$ | # | 分数 | 约束 | |:-:|:-:|:-:| | $1$ | $11$ | $N \le 5$ | | $2$ | $12$ | $N \le 100$ | | $3$ | $23$ | $N \le 500$ | | $4$ | $15$ | $N \le 1000$ | | $5$ | $13$ | $N \le 1200$ | | $6$ | $8 $ | 矩阵的内容是随机分配的。 | | $7$ | $18$ | 无额外约束 |