2024/12/24

树上排序

题目大意:给定一棵 \(n(n\le 5e5)\) 个节点的有根树,初始时每个节点有一个权值 \(a_i\),可以对 \(i=1,2,\dots,n\) 依次做以下操作:选择一个 \(i\) 子树内的节点并交换它们两个的权值。询问是否能够让节点 \(i\) 的权值为 \(i\)。给出方案。

先考虑如何判断是否有解。将每一个置换环拿出来,那么在这个环上的节点必须在同一条链上时才会有界。

考虑证明。首先,其它情况是一定无解的,也就是最存在两个节点 \(u,v\) 满足 \(a_v=u\) 且它们之间没有祖孙关系,此时至少要选择一个 \(u,v\) 的公共祖先将 \(a_v\) 放上去,而这个祖先只能操作一次,所以它没办法将 \(a_v\) 给到 \(u\)

其次,考虑构造出一种方案:

  • 一个大致的思想是,只有最深的点无法操作/不用操作,所通过其它点使得方案合法。
  • 按照 \(a_i\to i\) 的顺序来连边,可以构成一个环。
  • 按照编号从小到大来依次操作每一个点,假设当前操作 \(u\)
  • 选择一个点 \(v\),然后交换 \(u,v\),此时一定会分成两个环。
  • 目标是使得 \(u\) 是它所在的环中深度最大的点。这样子就可以递归子问题来处理。
  • 所以,只需要在原来的环上按顺序找到第一个深度比 \(u\) 大的点,就是 \(v\)

我们可以使用平衡树来维护每一个环。

APIO2012 派遣者

树上启发式合并,用大根堆来维护。

NOI2021 密码箱

我们知道,\(f(a_0,a_1,\dots,a_n)\) 的倒数是:

\[\frac{1}{a_0+\frac{1}{a_1+\dots}} \]

有这样一个合并的形式:\(\frac{a^\prime}{b^\prime}=\frac{1}{a_i+\frac{a}{b}}\)

化成 \(\frac{b}{a_ib+a}\),可以使用矩阵来刻画:

\[\left[\begin{matrix} a^\prime\\ b^\prime \end{matrix}\right]=\left[\begin{matrix} 0&1\\ 1&a_i \end{matrix}\right]\left[\begin{matrix} a\\ b \end{matrix}\right] \]

那么操作 W 相当于在末尾乘上一个:

\[\left[\begin{matrix} 1&1\\ 0&1 \end{matrix}\right] \]

而对于操作 E 则是乘上一个:

\[\left[\begin{matrix} 0&-1\\ 1&2 \end{matrix}\right] \]

可以使用平衡树来维护三种修改操作。

其他题目

  • SCOI2011 植物大战僵尸
posted @ 2024-12-25 21:40  ddxrS  阅读(18)  评论(0)    收藏  举报