NOI2024 D1T3 口胡题解

NOI2024 D1T3 口胡题解

题目条件其实就是说对于点对 \((a,b)\),从 \(a\)\(b\) 的路径上至少要有一条从 \(b\) 指向 \(a\)​ 的边。

将初始状态记作 \((T,S)\)​,其中 \(T\)​ 是树,\(S\)​ 是二元组 \((a,b)\)​ 的集合。注意到特殊性质 A 蕴含了:如果对于所有二元组 \((a,b)\)\(a\)​ 和 \(b\)​ 的距离都 \(\ge 2\)​​ ,那么一定存在合法的定向方案。下面所说的性质 A 就是指 "任意 \((a,b)\) 的距离都大于等于 2" 这个断言。

我们来看看对于性质 A,怎样构造出字典序最小的方案。考虑当前尚未定向的编号最小的边 \(i\)​,钦定 \(s_i=0\)​。接下来将 \(i\)​ 缩成一个点,同时一些点对 \((a,b)\)​ 的限制条件已经满足了,将它们从限制集合当中去掉,得到一个新的(规模更小的)状态 \((T',S')\)。这时候另一些(本来与 \(i\)​​ 相邻)的边的方向已经确定了,我们将它们缩掉。重复这一缩边的过程,直到不存在被钦定方向的边为止。

上述步骤不会导致无解的情况,也就是说最终得到的状态 \((T'',S'')\)(如果 \(S''\) 不为空的话)必然满足性质 A。这是因为,在上述步骤当中被缩掉的边必定形如(其中 \((u,v)\) 是最开始缩掉的边):

这样的话一般情况也是简单的:由于保证有解,我们只需不断缩掉被钦定方向的边,直到满足性质 A 即可。

每次缩边的时候暴力更新一下每个二元组的状态,就得到了平方的做法。

用倍增维护路径和边的关系,就得到了 \(\log\) 的做法(大概),感觉细节比较多。

posted @ 2024-08-27 22:38  TianyiLemon  阅读(155)  评论(0)    收藏  举报