FLASH坏块监测系统
2026华为OD机试双机位C卷 - 华为OD上机考试双机位C卷
华为OD机试双机位C卷真题目录点击查看: 【全网首发】2026华为OD机位C卷 机考真题题库含考点说明以及在线OJ(OD上机考试双机位C卷)
题目描述
开发一个 FLASH 坏块监测系统,能够监测 FLASH 中坏块的数量。FLASH 介质以一个大小为 m×n的二维二进制矩阵表示,其中:0 表示正常,1 表示异常。最初,FLASH 介质中的所有单元格都是正常(即,所有单元格都是 0)。 系统运行过程中,FLASH 坏块不断产生:随着系统持续运行,某一个时刻 i,FLASH 介质中的某个单元格 (ri,ci)由正常变为异常。返回一个整数数组 result,其中 result[i] 是 FLASH 介质中第 i 个时刻 (ri,ci)位置变为异常后,FLASH 中坏块的数量。坏块的定义:坏块是由 4 个方向相连的异常单元格组成的“极大”块。你可以假设给定的 FLASH 介质外的所有点都是正常的。
输入描述
第一行输入和第二行输入分别为 m 和 n,表示 FLASH 介质是 m×n的二维二进制矩阵。 第三行开始的每一行表示第 ii 个时刻新增的异常位置 (ri,ci)最多 1000 个。
注意:
- 1≤m,n≤10^3
- 1≤m×n≤10^4
- 0≤ri<m
- 0≤ci<n
输出描述
一个整数数组 result,其中 result[i] 是 FLASH 介质中第 i 个时刻 (ri,ci)位置变为异常后,FLASH 中坏块的数量。
示例1
输入
4
3
1,1
2,2
3,2
0,2
1,2
输出
[1,2,2,3,1]
说明
起初,FLASH 介质被认为全部是正常的(0 代表正常,1 代表异常)。 时刻 1:位置 [1,1] 由正常状态变为异常状态。此时存在 1 个坏块。 时刻 2:位置 [2,2] 由正常状态变为异常状态。此时存在 2 个坏块。 时刻 3:位置 [3,2] 由正常状态变为异常状态。此时存在 2 个坏块。 时刻 4:位置 [0,2] 由正常状态变为异常状态。此时存在 3 个坏块。 时刻 5:位置 [1,2] 由正常状态变为异常状态。此时存在 1 个坏块。
示例2
输入
1
1
0,0
输出
[1]
说明
解题思路
核心思想
本题要求在 的网格中,动态添加异常点,并计算每次添加后“坏块”的数量。坏块定义为由 4 个方向相连的异常单元格组成的极大块。这实际上是连通分量(Connected Components)问题。
- 并查集(Union-Find):
- 并查集是处理连通性问题的最佳工具。
- 我们将每个网格位置 映射为一个唯一的整数 ID(例如
r * N + c)。 - 初始时,所有点都是正常的,坏块数量为 0。
- 当一个位置变为异常时:
- 首先假设它是一个新的独立坏块,
count加 1。 - 然后检查它上下左右 4 个相邻位置。
- 如果相邻位置也是异常点,尝试将当前点与相邻点所在的连通分量进行合并(
union操作)。 - 如果两个点原本不在同一个连通分量中,合并成功,连通分量数量
count减 1。
- 首先假设它是一个新的独立坏块,
- 动态更新:
- 题目给出了操作序列,我们只需要按顺序处理每次更新,利用并查集维护当前的连通分量数量即可。
- 注意:如果一个位置已经是异常点,再次变为异常,状态不变,坏块数量也不变。
复杂度分析
- 时间复杂度:,其中 是操作次数, 是网格大小, 是反阿克曼函数(接近常数)。
- 空间复杂度:,用于存储并查集的父节点数组和网格状态。