2025.04.17 CW 模拟赛 D. 黑色连通块 & [CF1548E] Gregor and the Two Painters
D. 黑色连通块
原题链接.
题目描述
小明有一个 \(n \times m\) 的矩阵,每个格子不是白色就是黑色。这个矩阵由参数 \(x\) 以及一个长度为 \(n\) 的数组 \(a\) 和另一个长度为 \(m\) 的数组 \(b\) 构成。
矩阵的第 \(i\) 行第 \(j\) 列为黑色当且仅当 \(a_i + b_j \leq x\),反之为白色。
现在,你只需要输出,在四连通意义下,一共有多少个黑色的连通块即可。
思路
由于 \(n, m \le 2 \times 10^5\), 我们考虑对于每一个连通块使用一个点来确定, 我们称这个点为「代表点」.
根据定义, 代表点的数量即为连通块的数量. 我们再定义代表点为其所在连通块内 \(a_i + b_j\) 值最小的点 \((\)若值相同按坐标排序\()\).
考虑一个点 \((i, j)\) 在什么情况下会成为代表点. 我们记 \(u_i\) 分别表示上面第一个 \(a_{u_i} \le a_i\) 的行, \(d_i\) 表示下面第一个 \(a_{d_i} < a_i\) 的行, \(l_i\) 分别表示左边第一个 \(b_{l_j} \le b_i\) 的列, \(r_i\) 表示右边第一个 \(b_{r_j} < r_i\) 的列.
那么 \((i, j)\) 能够成为「代表点」当且仅当
-
\(a_i + b_j \le x\).
-
从 \((i, j)\) 出发无法到达图中 \(4\) 个黑点中的任意一个点.
证明: 充分性根据定义可知. 由于 \((i, j)\) 是代表点, 所以从 \((i, j)\) 出发可达的所有点都会被涂黑. 这时注意到一个性质
- 如果 \((i, j)\) 能够走到 \(u_i\) 行那么 \((i, j)\) 一定能走到 \((u_i, j)\).
方法就是先走到 \((i, k)\), 其中 \(k\) 指的是从 \((i, j)\) 能够走到的最小的 \(b_k\), 然后再走到 \((u_i, k)\), 最后到 \((u_i, j)\).
对于 \(a_{u_i}\) \((\)其余 \(3\) 个同理\()\), 由于 \(a_{u_i} \le a_i\), 所以 \(a_{u_i} + b_j \le a_i + b_j\). 若从 \((i, j)\) 出发可达 \((i, l_j)\), 那么 \((i, l_j)\) 也会被涂黑, 矛盾.
所以现在问题就转化为了
- 求出所有满足一下条件的 \((i, j)\) 的数量
- \(a_i + b_j \le x\).
- \(\displaystyle a_i + \min(\max_{k = l_j}^{j} b_k, \max_{k = j}^{r_j} b_k) > x\).
- \(\displaystyle \min(\max_{k = u_i}^{i} a_k, \max_{k = i}^{d_i} a_k) + b_j > x\).
这是一个二维偏序问题, 使用树状数组解决即可.
后话
当点数过大时, 我们可以考虑使用一个点来「代替」一个连通块.


浙公网安备 33010602011771号