NOIP 2023 三值逻辑

problem

我们定义 \(\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\) 是什么。

  1. 是 \(\text{U}\),那么将 \(pT_i\) 和 \(pF_i\) 合并到一起。

  2. 是 \(\text{T}\),直接跳过即可。

  3. 是 \(x_j\),说明 \(x_i\) 和 \(x_j\) 一致,合并 \(pT_i\) 和 \(pT_j\) 以及 \(pF_i\) 和 \(pF_j\)。

  4. 是 \(-x_j\),说明 \(x_i\) 和 \(-x_j\) 一致,则合并 \(pT_i\) 和 \(pF_j\) 以及 \(pF_i\) 和 \(pT_j\)

最后判断有几对 \(pT\) 和 \(pF\) 在一个并查集里即可。

code

posted @ 2023-12-03 22:16  sqrtqwq  阅读(423)  评论(0)    收藏  举报