我们定义 \(\text{T}\) 对应 \(n + 1\),\(\text{U}\) 对应 \(n + 2\),\(\text{F}\) 就是 \(-\text{T}\)。
现在我们知道了每一个数代表着什么值,用 \(val\) 数组来表示。
然后我们构想两个数组 \(pT\) 和 \(pF\) 分别记录这个数是不是 \(\text{T}\) 或者 \(\text{F}\)。
显然一般情况下 \(pF\) 和 \(pT\) 不会在一个并查集中,除非这个是 \(\text{U}\)。
所以对于 \(i\) 我们都考虑 \(val_i\) 是什么。
-
是 \(\text{U}\),那么将 \(pT_i\) 和 \(pF_i\) 合并到一起。
-
是 \(\text{T}\),直接跳过即可。
-
是 \(x_j\),说明 \(x_i\) 和 \(x_j\) 一致,合并 \(pT_i\) 和 \(pT_j\) 以及 \(pF_i\) 和 \(pF_j\)。
-
是 \(-x_j\),说明 \(x_i\) 和 \(-x_j\) 一致,则合并 \(pT_i\) 和 \(pF_j\) 以及 \(pF_i\) 和 \(pT_j\)
最后判断有几对 \(pT\) 和 \(pF\) 在一个并查集里即可。
标签:三值,pT,text,val,pF,2023,NOIP,并查 From: https://www.cnblogs.com/Carousel/p/17873925.html