树上排序
题目大意:给定一棵 \(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
相当于在末尾乘上一个:
而对于操作 E
则是乘上一个:
可以使用平衡树来维护三种修改操作。
其他题目
- SCOI2011 植物大战僵尸