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)\) 的。

posted @ 2026-01-15 16:19  Oken喵~  阅读(0)  评论(0)    收藏  举报