NOIP 2023 三值逻辑

发布时间 2023-12-03 22:20:27作者: feather_life

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