#1369. 危险的积木塔

    ID: 1369 传统题 3000ms 256MiB 尝试: 1 已通过: 1 难度: 普及 上传者: 标签>基础算法二分贪心数据结构优先队列

危险的积木塔

题目描述

你在玩一个 2D 层叠积木(Jenga)游戏,该游戏由一个 nn 行 mm 列的网格表示。第 11 行是积木塔的最顶层,第 nn 行是最底层。

位于第 ii 行第 jj 列的每一块积木都有一个“失稳系数” ai,ja_{i,j}。此外,每一层 ii 都有一个初始的“稳定指数” viv_i。

当你移除一块积木时,它将从游戏中完全被丢弃。从第 ii 行移除一块积木,会对该层及以上的所有层造成破坏。具体来说,对于每一个满足 1≤k≤i1 \le k \le i 的行 kk,其稳定指数都会减去 ai,ja_{i,j}。

如果满足以下任一条件,积木塔就会倒塌:

  1. 任何一层的稳定指数降至 00 或 00 以下。
  2. 任何一层的积木数量恰好变为 00 块(即使是最顶层)。

请找出导致积木塔倒塌所必须移除的最少积木数量。

输入格式

第一行包含一个整数 tt(1≤t≤1041 \le t \le 10^4)—— 测试用例的数量。

对于每个测试用例:

  • 第一行包含两个整数 nn 和 mm(1≤n,m≤1061 \le n, m \le 10^6)—— 积木塔的行数和列数。
  • 第二行包含 nn 个整数 v1,v2,…,vnv_1, v_2, \dots, v_n(1≤vi≤1091 \le v_i \le 10^9)—— 从顶层到底层各层的初始稳定指数。
  • 接下来 nn 行,每行包含 mm 个整数。第 ii 行的第 jj 个整数为 ai,ja_{i,j}(1≤ai,j≤1091 \le a_{i,j} \le 10^9)—— 表示第 ii 行第 jj 列积木的失稳系数。

输出格式

对于每个测试用例,输出一行一个整数,表示使积木塔倒塌所必须移除的最少积木数量。

样例输入 1

2
2 3
10 20
2 2 2
5 5 5
3 1
100 100 100
1
2
3

样例输出 1

2
1

说明

样例解释

  • 在第一个测试用例中,我们有一个 2×32 \times 3 的塔。初始稳定指数为 v1=10,v2=20v_1=10, v_2=20。顶层(i=1i=1)积木的失稳系数为 2,2,22, 2, 2。底层(i=2i=2)积木的失稳系数为 5,5,55, 5, 5。 如果我们从底层移除两块积木,将对第 22 层造成 5+5=105+5=10 的破坏,同时对第 11 层也造成 5+5=105+5=10 的破坏。第 11 层的剩余稳定指数变为 10−10=010 - 10 = 0。由于其稳定指数降至 ≤0\le 0,塔倒塌了。因此,我们必须移除的最少积木数为 22。
  • 在第二个测试用例中,m=1m=1。规则指出,如果任何一层剩余的积木数量恰好为 00,塔就会倒塌。由于每层初始只有 11 块积木,从塔中移除任何 11 块积木都会立刻导致某一层变空并引发倒塌。因此,最少需要移除的积木数量为 11。

数据范围

  • 对于所有测试点,保证 1≤t≤1041 \le t \le 10^4。
  • 对于每个测试用例,保证 1≤n,m≤1061 \le n, m \le 10^6。
  • 保证同一测试点内所有测试用例的 n×mn \times m 之和不超过 10610^6。
  • 对于所有测试点,保证 1≤vi,ai,j≤1091 \le v_i, a_{i,j} \le 10^9。
  • 保证所有的输入数值均为整数。