华为OD机考双机位C卷 - FLASH坏块监测系统 (Java & Python & JS & GO & C++ & C)

3 阅读3分钟

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]

说明

解题思路

核心思想

本题要求在 M×NM \times N 的网格中,动态添加异常点,并计算每次添加后“坏块”的数量。坏块定义为由 4 个方向相连的异常单元格组成的极大块。这实际上是连通分量(Connected Components)问题。

  1. 并查集(Union-Find)
    • 并查集是处理连通性问题的最佳工具。
    • 我们将每个网格位置 (r,c)(r, c) 映射为一个唯一的整数 ID(例如 r * N + c)。
    • 初始时,所有点都是正常的,坏块数量为 0。
    • 当一个位置变为异常时:
      1. 首先假设它是一个新的独立坏块,count 加 1。
      2. 然后检查它上下左右 4 个相邻位置。
      3. 如果相邻位置也是异常点,尝试将当前点与相邻点所在的连通分量进行合并(union 操作)。
      4. 如果两个点原本不在同一个连通分量中,合并成功,连通分量数量 count 减 1。
  2. 动态更新
    • 题目给出了操作序列,我们只需要按顺序处理每次更新,利用并查集维护当前的连通分量数量即可。
    • 注意:如果一个位置已经是异常点,再次变为异常,状态不变,坏块数量也不变。

复杂度分析

  • 时间复杂度O(Kα(MN))O(K \cdot \alpha(MN)),其中 KK 是操作次数,MNMN 是网格大小,α\alpha 是反阿克曼函数(接近常数)。
  • 空间复杂度O(MN)O(MN),用于存储并查集的父节点数组和网格状态。