CF1977E Tensor

题目大意:

有一个 \(n\) 个点的隐藏的有向图,保证所有的 \(i \to j\) 的边都满足 \(i < j\)
且对于任意的三点,至少有两个点 \(i < j\) 可以保证 \(i\) 能到达 \(j\)
你每次可以询问 \(i,j\) 表示询问 \(i\) 是否可以到达 \(j\)
在至多 \(2 \times n\) 次询问后,你需要将每个点 \(01\) 染色,使得颜色相同的两两可达。
\(n \le 100\)

解题思路:

首先根据 Dilworth 定理,最小链覆盖等于最大反链,而本题的最大反链显然最大为 2。
也就是我们一定存在一个合法的方案。

由于他保证所有的有向边都满足 \(i < j\),那么我们自然想到从小到大将数加进集合里。
如果我们遇到了一个只能加进一个集合的点,那么我们必须将他加进集合内。
可如果遇到了一个能加进两个集合的点,他可能会影响后面的点能否加入。

所以我们考虑将这些点特殊地放到一个新的集合内,表示两个集合都能放。
这样我们一旦遇到一个不能加入第三个集合的点,就将第三个集合中的点和当前点分开放并清空。

在发现做法的正确性不对的时候,可以去考虑我们期望代码的结果与实际哪里不同,为什么不同。
这也是修锅的一种方向。

posted @ 2025-09-09 17:41  positive_deviation  阅读(9)  评论(0)    收藏  举报