QOJ # 4424. Babushka and her pierogi

发布时间 2023-10-26 16:30:29作者: 275307894a

题面传送门

好题!

首先我们考虑操作次数应该是多少,如果将每个点现在在的位置向将要到的位置连一条边,那么一个下界是 \(n\) 减去环的个数。

同时我们考虑如果不算 \(C\) 这个常数,最小的代价应该是多少。一个下界是 \(\frac{1}{2}\sum\limits_{i=1}^{n}{|a_i-b_i|}\),这个下界不难理解,每次移动一个 pierogi 至多只会让两个位置的 \(a_i\)\(b_i\) 靠近一步,因此总的贡献至少是这个。

现在是有点脑洞的一步,我们可以说明这两个下界是可以同时取到的!

因为每个环独立,所以对于每个环分别考虑。环上每个位置有一个 \(a_i\)\(b_i\),表示现在在这个位置上的数 \(a_i\) 和目标的 \(b_i\),我们将其看成一条从 \(a_i\) 指向 \(b_i\) 的线段,所有这样的线段绕成了一个环。考虑 \(b_i\) 最小的一个位置,考虑这个 \(b_i\) 指出的 \(a_j\) 所指向的 \(b_j\),若 \(b_j>a_i\),则直接对 \(i,j\) 操作,两个点都向目标靠近。否则归纳考虑 \(b_j\) 的指向,容易发现一定存在一个可以操作,得到两个更小的环,那么就一定可以在环长 \(-1\) 次以内消完,并且每次消除都让两个点均向目标靠近,所以这两个下界都是可以取到的。

现在根据这个证明过程我们有一个 \(O(n^2)\) 的暴力,考虑优化。每次找到最小点的时候,我们维护两个指针,一个从这个点往前跑,一个从这个点往后跑,遇到能消的就消,直到 \(b\) 最小的那个点的 \(a\) 正确为止。这样的复杂度就是 \(O(n\log n)\) 的,因为每次分裂的复杂度是较小的环长度,所以复杂度证明可以参考启发式分裂的复杂度,是 \(O(n\log n)\)

submission