QOJ.ac

QOJ

Type: Editorial

Status: Open

Posted by: tzl_Dedicatus545

Posted at:

Last updated:

Back to Problem

加强版线性做法

可以加强到给定任意有向树,而不囿于外向树。并且可以做到 $\mathcal O(n\log n)$,四毛子一下也可以做到 $\mathcal O(n)$。

首先我们考虑时光倒流,在删边的时候维护限制,假设目前要删的边是 $u\to v$。不妨假设 $u$ 在的那边是左子树,$v$ 在的那边是右子树。

因为合并的时候肯定左子树是一个连续段,右子树也是一个连续段,但可能会带来一些头和尾的限制,形如“$x$ 可达的所有点在这棵树中编号是一个前缀“”$y$ 可达的所有点在这棵树中编号是一个后缀”这样的,并且本质不同的只有这两种限制!也就是说,我们如果限制 $x_1$ 和 $x_2$ 都是前缀,那么假若 $x_1$ 可达 $x_2$,那么相当于只限制 $x_2$,反之则只限制 $x_1$,若 $x_1$ 和 $x_2$ 均不可达对方,那么一定无解(这是因为无论哪个是前缀都会导致另一个不是前缀)。

那么我们考虑对此进行递归,假设目前要删的边是 $u\to v$,并且限制是 $x$ 是前缀,$y$ 是后缀,讨论一下只会有如下情况(其中某个点是否可达某个子树中的所有点和某个点是否可达另一个点都是好处理的):

  • $x$ 在右子树中:要求一定按照右左的顺序走下去,并要求 $x$ 可达是右子树的前缀。
  • $x$ 不可达 $u$:要求一定按照左右的顺序走下去,并要求 $x$ 可达是左子树的前缀。
  • $x$ 可达 $u$,但不可达左子树和右子树的所有点:无解。
  • $x$ 可达 $u$,可达左子树的所有点,不可达右子树的所有点:要求一定按照左右的顺序走下去,并要求 $v$ 可达是右子树的前缀。
  • $x$ 可达 $u$,不可达左子树的所有点,可达右子树的所有点:要求一定按照右左的顺序走下去,并要求 $x$ 可达是左子树的前缀。
  • $x$ 可达 $u$,可达左子树的所有点,可达右子树的所有点:随便。

$y$ 的限制是类似的。递归下去即可。上述条件均可在 $\mathcal O(1)$ 次 LCA 内判定,因此总复杂度是 $\mathcal O(n\log n)$ 的。

Comments

No comments yet.