#CF2027B. 斯大林类型
斯大林类型
B. 斯大林排序
每次测试时间限制: 秒
每次测试内存限制: 兆字节
斯大林排序是一种幽默的排序算法,其设计思路是直接删除那些位置不对的元素,而不是费心去正确排序它们,因此时间复杂度为 。
算法流程如下:从数组的第二个元素开始,如果它严格小于前一个元素(忽略已经被删除的元素),则将其删除。继续遍历数组,直到数组变为非递减顺序。例如,数组 经过斯大林排序后变为 。
我们定义一个数组是脆弱的,如果可以通过对其任意子数组反复应用斯大林排序(需要多少次就应用多少次),最终将其排序为非递增顺序。
给定一个包含 个整数的数组 ,请确定最少需要从数组中移除多少个整数,才能使其变得脆弱。
数组 是数组 的子数组,如果 可以通过从 的开头删除若干(可能为零或全部)元素以及从结尾删除若干(可能为零或全部)元素得到。
输入
每个测试包含多个测试用例。第一行包含一个整数 ()——测试用例的数量。接下来是每个测试用例的描述。
每个测试用例的第一行包含一个整数 ()——数组的大小。
第二行包含 个整数 ()。
保证所有测试用例的 之和不超过 。
输出
对于每个测试用例,输出一个整数——使数组变得脆弱所需移除的最少整数个数。
示例
输入
6
7
3 6 4 9 2 5 2
5
5 4 4 2 2
8
2 2 4 4 6 6 10 10
1
1000
9
6 8 9 10 12 9 7 5 4
7
300000000 600000000 400000000 900000000 200000000 400000000 200000000
输出
2
0
6
0
4
2
注意
在第一个测试用例中,最优解是移除数字 和 ,剩下 。为了证明这个数组是脆弱的,可以先对子数组 应用斯大林排序,得到 ,然后对子数组 应用斯大林排序,得到 ,它是非递增的。
在第二个测试用例中,数组已经是非递增的,因此不需要移除任何整数。