#P12019. [NOISG 2025 Finals] Flooding

[NOISG 2025 Finals] Flooding

Description

Pavementland 是一座城市,可以用一个 h×wh \times w 的矩形网格表示。网格的行从北到南编号为 11hh,列从西到东编号为 11ww。我们将位于网格第 rr 行、第 cc 列的单元格称为单元格 (r,c)(r, c)

在网格中,每个单元格要么是空的,要么包含一座建筑。至少有一个单元格是空的。

由于季风暴潮,Pavementland 发生了突发洪水。最初,一场降雨导致某个空单元格被水淹没。然后,水按照以下规则流动:

  • 如果一个空单元格与至少一个被淹没的单元格相邻,它也会被淹没。
  • 如果一个包含建筑的单元格与至少两个被淹没的单元格相邻,该建筑会倒塌,该单元格变为被淹没状态。

请注意,如果两个单元格共享一条边,则它们是相邻的。一个单元格最多可以与四个其他单元格相邻。进一步说明,水不会流出网格范围。令 f((r,c))f((r, c)) 表示如果单元格 (r,c)(r, c) 最初被淹没,则最终被淹没的单元格总数。

市政官员希望预测所有可能情况下的洪水蔓延范围。请帮助他们计算所有空单元格 (r,c)(r, c)f((r,c))f((r, c)) 之和。

Input Format

你的程序必须从标准输入读取数据。

输入的第一行包含两个用空格分隔的整数 hhww

接下来的 hh 行中,每行包含一个长度为 ww 的二进制字符串。如果第 rr 行的第 cc 个字符是 00,则单元格 (r,c)(r, c) 是空的。如果该字符是 11,则单元格 (r,c)(r, c) 包含一座建筑。

Output Format

你的程序必须向标准输出打印结果。

输出一个单一整数,表示所有空单元格 (r,c)(r, c)f((r,c))f((r, c)) 之和。

3 3
000
011
010
46
5 5
00101
01011
11010
01101
11000
182
1 10
1101011100
6

Hint

子任务

对于所有测试用例,输入将满足以下约束条件:

  • 1h,w50001 \leq h, w \leq 5000
  • 网格中至少有一个空单元格。

你的程序将在满足以下特殊性质的输入数据上进行测试:

子任务 分数 特殊性质
00 样例
11 55 h=1h = 1
22 77 h,w80h, w \leq 80
33 1616 h,w500h, w \leq 500
44 3232 h,w2000h, w \leq 2000
55 4040

样例 1 解释

此样例适用于子任务 2255

如果单元格 (1,1),(1,2),(1,3),(2,1)(1, 1), (1, 2), (1, 3), (2, 1)(3,1)(3, 1) 最初被淹没,则整个网格最终都会被淹没。如果单元格 (3,3)(3, 3) 最初被淹没,则最终只有 11 个单元格被淹没。因此,输出为 9+9+9+9+9+1=469 + 9 + 9 + 9 + 9 + 1 = 46

样例 2 解释

此样例适用于子任务 2255

样例 3 解释

此样例适用于所有子任务。