一道并查集的题目,实现的时候细节较多。
【注: 以下 fa 与 num 数组的 $1 \sim n$ 存第一个数组, $n + 1 \sim 2n$ 存第二个数组。】
因为与字符有关系,所以可以用 map 来记录每一个变量/数字所出现的第一个位置并标记 fa[i] = i。
1 | if (num[a[i]] != 0) fa[i] = num[a[i]]; |
接下来就要以 $O(n)$ 的时间复杂度依次判断每个数组的第 $i$ 位是否符合要求了。这里需要进行分类讨论,有以下几种情况 (设两个数组分别为 a 与 b,find (int x) 为找到 $x$ 的父亲):
- $a_i$ 与 $b_i$ 均为常量 直接比较是否相等即可
- $a_i$ 为常量, $b_i$ 为变量
2.1. $b_i$ 的值已经确定 比较是否相等
2.2. $b_i$ 的值未确定fa[find (b[i])) = find (a[i]) - $a_i$ 为变量, $b_i$ 为常量
3.1. $a_i$ 的值已经确定 比较是否相等
3.2. $a_i$ 的值未确定fa[find (a[i])) = find (b[i]) - $a_i$ 与 $b_i$ 均为变量
4.1. $a_i$ 与 $b_i$ 均已经确定 比较是否相等
4.2. 只有 $a_i$ 已经确定fa[find (b[i])) = find (a[i])
4.3. 只有 $b_i$ 已经确定fa[find (a[i])) = find (b[i])
4.4. $a_i$ 与 $b_i$ 均未确定 随便选一个作为父亲,进行合并
于是就有代码:
1 | bool correct (int x) |
最后若所有返回值都是 1,则符合题意;否则就是不符合。