三人编程锦标赛 Triinformathlon 题解

· · 题解

solution

很好的题目。

题目让我们解决一个偏序问题,我们可以按照题目要求建边,即如果 a 优于 b,那么建边 a \to b。显然这是一个竞赛图(完全图定向之后的图),我们回答询问的时候,其实就是看 a_i,b_i 之间的可达性。

这个问题看起来不太好解决,那么给出一个定理:竞赛图进行缩点之后,是一条链。

::::success[证明] 考虑归纳法。

起点:n=1 时,只有一个点,可以看作一条链。

归纳:我们有一个 n-1 个点的竞赛图,它缩点之后是一条链,那么我们新加入一个点 n,有以下几种情况。

::::

接下来我们直接按照题目的优于的判断条件为 cmp 排序(从前到后越来越优),这样我们发现,形成 scc 的部分没有办法正常排序,而 scc 之间的大小关系是正确的,换句话说,就是 scc 在排序后序列的一个区间中。

类似于 tarjan 中的返祖边,在排序后的数组中,如果存在 j < i 并且 j 优于 i,那么 i,j 在一个 scc 中。

最后回答询问的时候条件就是排序后 i,j 的位置 rk_i, rk_jrk_i < rk_j 或者 rk_i,rk_j 在同一个 scc 中。