CF1967D Long Way to be Non-decreasing
给定长度为 \(n\) 的整数序列 \(A\) 和长度为 \(m\) 的整数序列 \(B\),满足 \(a_i,b_i \in [1,m]\)。
你需要进行若干次下面的操作,使得 \(A\) 变为不降序列:
-
选择 \(S \subseteq \{1,2,\dots,n\}\)。
-
对于所有 \(i \in S\),\(a_i \leftarrow b_{a_i}\)。
求最少的操作次数,无解返回 \(-1\)。
\(1 \leq n,m \leq 10^6\)。
考虑一个暴力的做法。
发现答案具有可二分性。不妨假设当前答案是 \(mid\),此时每个数最多被操作 \(mid\) 次。
在二分出答案后,每一步我们尽量贪心的往小选,这样一定更优。
这是一棵基环树,此时使用高妙的树上数据结构技巧可以做到 \(\operatorname{polylog}\) 复杂度。
然而数据范围是 \(10^6\),你这么写怕是 \(\texttt{4s}\) 也过不去。
考虑二分这个东西大概是去不掉的,此时我们考虑优化后面的过程。
我们不妨从值的角度开始考虑,能取得当前值就取,否则将当前值加 \(1\)。
接下来我们只需要考虑两个点的距离即可,这很简单。
具体地,如果两个点不在一棵基环树上,距离为 \(\infty\)。
否则两个点在一棵基环树上,考虑若终点在环上,则距离为起点深度与环上的距离之和。
接下来终点不在环上,只有另一个点在终点的子树内才有解。
此时可以用 dfn 序简单判断子树关系,\(n\) 和 \(m\) 同阶就是 \(O(n \log n)\) 的。

浙公网安备 33010602011771号