小 A 又在摆弄他的积木啦。
他有 N 块积木,积木的高度恰好是 1 \sim N,他把积木打乱后排成了一条直线。
小 Z 是小 A 编程班的同学,他看着这些积木,想起了今天做的编程题中的一个问题,于是他把这个问题讲给小 A 听,一起讨论这个问题的做法。
小 Z 说,我们指定如下的排序规则,要求必须在满足规则的情况下操作,最终让积木从矮到高排好队。
可以将积木划分成若干个高度连续单调递减的子序列。
每次可以将某个至少由 2 块积木组成的高度连续单调递减的子序列翻转(如:6 5 3 1,翻转为 1 3 5 6)。
重复上述操作,直到所有的积木都按照高度从矮到高排好队。
求:最少需要进行多少次翻转操作。
小 A 和小 Z 开始了紧张的探讨,请你编程帮助小 A 和小 Z 计算出答案,方便他们验证自己探讨的结果。
第一行有一个正整数 N。
第二行包含 N 个互不相同的的正整数,代表每块积木的高度,这些数一定是由 1 \sim N 组成。
测试数据保证:首次将积木划分成若干个高度连续单调递减的子序列,此时满足题意的每个子序列的长度都是偶数。
输出一个整数,代表需要翻转的最少次数。
6 2 1 6 5 4 3
2
4 3 1 4 2
3
10 6 5 10 9 8 7 2 1 4 3
19
将子序列 [2,1] 和 [6,5,4,3] 分别翻转,即有序,因此只需要翻转 2 次。
第一轮将子序列 [3,1] 、[4,2] 分别翻转,翻转次数为 2。
第二轮将子序列 [3,2] 翻转,即有序。
因此一共需要翻转 2+1=3 次。
对于 20\% 的数据,2 \le N \le 500。
对于 40\% 的数据,2 \le N \le 3000。
对于 100\% 的数据,2 \le N \le 10^5。