#6584. B - 循环移位与反转

B - 循环移位与反转

当前没有测试数据。

B - 循环移位与反转

时间限制​:2 秒 ​内存限制​:1024 MiB ​分值​:400 分


【题目描述】

给定一个整数排列 p1,p2,p_1, p_2, \dots, p_n,它是 1n1 \sim n 的一个排列。

你可以对该排列进行任意次数、任意顺序的如下两种操作:

  1. 反转整个排列​: 将 (p1,p2,…,pn)变为 (pn,pn−1,…,p1)
  2. 循环移位​(把开头元素移到结尾): 将 (p1,p2,…,pn) 变为 (p2,p3,…,pn,p1)

保证通过若干次操作,可以把排列变为升序排列 (1,2,…,n)

请你求出所需的最少操作次数。


【输入格式】

n
p1 p2 … pn

【输出格式】

输出一个整数,表示将排列排序所需的最少操作次数。


【约束条件】

  • 2n1052 \leq n \leq 10^5
  • p1,…,pn的一个排列
  • 保证可以通过操作使其变为升序排列

【样例输入 1】

3
1 3 2

【样例输出 1】

2

解释:

  • 先把第一个元素移到末尾 → 得到 (3,2,1)
  • 再反转整个排列 → 得到 (1,2,3) 共需 2 步,且无法更少。

【样例输入 2】

2
2 1

【样例输出 2】

1

解释:做一次操作(反转或循环移位)即可排好。


【样例输入 3】

10
2 3 4 5 6 7 8 9 10 1

【样例输出 3】

3

解释:

  • 反转 → (1,10,9,8,7,6,5,4,3,2)
  • 移位 → (10,9,8,7,6,5,4,3,2,1)
  • 再反转 → (1,2,3,4,5,6,7,8,9,10) 共需 3 步。

【样例输入 4】

12
1 2 3 4 5 6 7 8 9 10 11 12

【样例输出 4】

0

解释:已经有序,不需要操作。