CF1896E 题解

发布时间 2024-01-13 16:38:05作者: BlNYU

题意

给一个 \(n\) 阶全排列 \(a\),每次把不满足 \(a_i = i\)\(a_i\) 向右循环移位一位,问从移位多少次后起所有 \(i \in [1,n]\) 都满足 \(a_i = i\)

思路

先断环成链后再复制一次,可以发现此时的移位等价于向右移位。发现一条性质:若 \(i < j\),则在 \(a_j\) 停止移位时,\(a_i\) 一定在 \(a_j\) 后面,反证法易证。而在 \(a_j\) 停下后,若 \(a_i > j\),显然 \(a_i\) 移动时会跨过 \(j\),让答案减一。所以如果把每一个数的起点和终点看做一段区间,则该数的答案为区间长度减去包含的区间个数。

在具体实现时,我们可以从 \(2n\)\(1\) 枚举左端点,如果该区间右端点大于 \(2n\) 直接跳过,则一个区间 \(i\) 会受到已经遍历过的区间 \(j\) 的影响当且仅当 \(r_i < r_j\)\(r\) 为区间右端点),使用线段树、树状数组、set 等实现即可。