AT_bogosortcontest_div1_h Please Insert Coin
题目描述
有一个纵向 $H$ 格、横向 $W$ 格的网格。从上往下第 $i$ 行、从左往右第 $j$ 列的格子记为 $(i, j)$。每个格子 $(i, j)$ 中写有一个整数 $A_{i,j}$,表示该格子被放置方块的时刻。
时间从 $1$ 前进到 $K = \max(A_{i,j})$。数组 $A$ 满足以下性质:
- 对于任意满足 $1 \le k \le K$ 的整数 $k$,至少存在一个格子 $(i,j)$ 使得 $A_{i,j} = k$。
- 具有相同值 $k$ 的格子集合,在上下左右方向上连通。
- 方块在每个列中从下往上依次堆积。也就是说,对于任意 $1 \le i \le H-1$ 和 $1 \le j \le W$,都有 $A_{i+1, j} \le A_{i, j}$。
在某个时刻,设第 $j$ 列已经堆积的方块数量为 $h_j$。初始状态下,所有列都有 $h_j = 0$。
soryuusi 君在初始状态下位于第 $s$ 列。对于时刻 $k = 1, 2, \dots, K$,游戏按顺序如下进行:
1. **soryuusi 君的移动**:soryuusi 君可以在网格内向左或向右移动到相邻的列,每次移动 $1$ 列,可以移动任意多次(也可以不移动,停留在当前列)。每从列 $x$ 移动到相邻的列 $y$ 一次,使用该时刻的方块高度消耗 $|h_x - h_y| + 1$ 的体力。
2. **方块的放置**:所有满足 $A_{i,j} = k$ 的格子都会被放置方块,对应列的 $h_j$ 分别增加该列新放置的方块数量。此时,如果 soryuusi 君当前所在的列有至少一个新方块被放置,那么 soryuusi 君会被压扁,游戏结束。
请判断 soryuusi 君能否在不游戏结束的情况下存活到时刻 $K$ 的方块放置结束。如果可以,请求出消耗体力的总计最小值。如果不可能存活,则输出 `-1`。
给定 $T$ 个测试用例,请分别求出答案。
输入格式
输入按以下形式从标准输入给出。
> $T$
> $\mathrm{case}_1$
> $\mathrm{case}_2$
> $\vdots$
> $\mathrm{case}_T$
每个测试用例按以下形式给出。
> $H$ $W$ $s$
> $A_{1,1}$ $A_{1,2}$ $\dots$ $A_{1,W}$
> $A_{2,1}$ $A_{2,2}$ $\dots$ $A_{2,W}$
> $\vdots$
> $A_{H,1}$ $A_{H,2}$ $\dots$ $A_{H,W}$
输出格式
输出共计 $T$ 行答案。第 $t$ 行输出第 $t$ 个测试用例的答案。即,消耗体力的最小值。如果不可能存活,则输出 `-1`。
说明/提示
### 样例解释 1
对于第 $1$ 个测试用例,soryuusi 君可以按如下方式行动,从而消耗体力 $10$。
- 移动到第 $4$ 列。消耗 $(|0 - 0| + 1) + (|0 - 0| + 1) + (|0 - 0| + 1) = 3$ 的体力。
- 时刻 $1$ 的方块被放置。
- 移动到第 $2$ 列。消耗 $(|0 - 1| + 1) + (|1 - 2| + 1) = 4$ 的体力。
- 时刻 $2$ 的方块被放置。
- 移动到第 $4$ 列。消耗 $(|2 - 2| + 1) + (|2 - 3| + 1) = 3$ 的体力。
- 时刻 $3$ 的方块被放置。
不可能以 $9$ 或更少的体力存活,因此消耗体力的最小值为 $10$。
对于第 $2$ 个测试用例,无论 soryuusi 君如何行动,都无法回避时刻 $2$ 的方块放置。因此该测试用例的输出为 `-1`。
### 约束
- $1 \le T \le 10^5$
- $1 \le H, W$
- $H \times W \le 5 \times 10^5$
- $1 \le s \le W$
- $1 \le A_{i,j} \le H \times W \ (1 \le i \le H, 1 \le j \le W)$
- 对于任意满足 $1 \le k \le K$ 的整数 $k$,至少存在一个格子 $(i,j)$ 使得 $A_{i,j} = k$
- 满足 $A_{i,j} = k$ 的格子 $(i,j)$ 的集合,在上下左右方向上连通
- $A_{i+1, j} \le A_{i, j} \ (1 \le i \le H-1, 1 \le j \le W)$
- 所有测试用例中 $H \times W$ 的总和不超过 $5 \times 10^5$
- 输入中的所有数值均为整数
由 DeepSeek V4.1 Flash 翻译。