#CF2027B. 斯大林类型

斯大林类型

B. 斯大林排序
每次测试时间限制:11
每次测试内存限制:256256 兆字节

斯大林排序是一种幽默的排序算法,其设计思路是直接删除那些位置不对的元素,而不是费心去正确排序它们,因此时间复杂度为 O(n)O(n)

算法流程如下:从数组的第二个元素开始,如果它严格小于前一个元素(忽略已经被删除的元素),则将其删除。继续遍历数组,直到数组变为非递减顺序。例如,数组 [1,4,2,3,6,5,5,7,7][1,4,2,3,6,5,5,7,7] 经过斯大林排序后变为 [1,4,6,7,7][1,4,6,7,7]

我们定义一个数组是脆弱的,如果可以通过对其任意子数组反复应用斯大林排序(需要多少次就应用多少次),最终将其排序为非递增顺序。

给定一个包含 nn 个整数的数组 aa,请确定最少需要从数组中移除多少个整数,才能使其变得脆弱。

数组 aa 是数组 bb 的子数组,如果 aa 可以通过从 bb 的开头删除若干(可能为零或全部)元素以及从结尾删除若干(可能为零或全部)元素得到。

输入
每个测试包含多个测试用例。第一行包含一个整数 tt1t5001 \le t \le 500)——测试用例的数量。接下来是每个测试用例的描述。
每个测试用例的第一行包含一个整数 nn1n20001 \le n \le 2000)——数组的大小。
第二行包含 nn 个整数 a1,a2,,ana_1, a_2, \dots, a_n1ai1091 \le a_i \le 10^9)。
保证所有测试用例的 nn 之和不超过 20002000

输出
对于每个测试用例,输出一个整数——使数组变得脆弱所需移除的最少整数个数。

示例
输入

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  

注意
在第一个测试用例中,最优解是移除数字 3399,剩下 a=[6,4,2,5,2]a = [6,4,2,5,2]。为了证明这个数组是脆弱的,可以先对子数组 [4,2,5][4,2,5] 应用斯大林排序,得到 a=[6,4,5,2]a = [6,4,5,2],然后对子数组 [6,4,5][6,4,5] 应用斯大林排序,得到 a=[6,2]a = [6,2],它是非递增的。

在第二个测试用例中,数组已经是非递增的,因此不需要移除任何整数。