题目
Example
input
5
4
1 2 3 4
7
4 3 3 8 4 5 2
3
1 1 1
7
1 3 1 4 5 3 2
5
5 4 3 2 3
output
0
4
0
2
3
Note
In the first test case of the example, the array a is already good, so we don’t need to erase any prefix.
In the second test case of the example, the initial array a is not good. Let’s erase first 4 elements of a, the result is [4,5,2]. The resulting array is good. You can prove that if you erase fewer number of first elements, the result will not be good.
大致翻译:
给你一个由n个整数组成的数组。必须找到要从中删除的元素的最小(最短)前缀的长度,才能使其成为一个好的数组。回想一下,数组a的前缀=[a1,a2,…,an]是由几个第一个元素组成的子数组:长度为k的数组a的前缀是数组[a1,a2,…,ak](0≤k≤n)。
长度为m的数组b称为good,如果可以从中获得一个非递减数组c(c1≤c2≤⋯≤cm),重复以下操作m次(最初,c为空):
选择b的第一个或最后一个元素,将其从b中移除,并将其附加到数组c的末尾。
例如,如果我们做4个运算:取b1,然后是bm,然后是bm−1,最后是b2,然后b变成[b3,b4,…,bm−3],c=[b1,bm,bm−1,b2]。
考虑以下示例:b=[1,2,3,4,4,2,1]。这个数组很好,因为我们可以通过以下操作序列从中获得非递减数组c:
取b的第一个元素,那么b=[2,3,4,4,2,1],c=[1];
取b的最后一个元素,那么b=[2,3,4,4,2],c=[1,1];
取b的最后一个元素,那么b=[2,3,4,4],c=[1,1,2];
取b的第一个元素,那么b=[3,4,4],c=[1,1,2,2];
取b的第一个元素,那么b=[4,4],c=[1,1,2,2,3];
取b的最后一个元素,所以b=[4],c=[1,1,2,2,3,4];
取b的唯一元素,因此b=[],c=[1,1,2,2,3,4,4]-c是非递减的。
请注意,由一个元素组成的数组是好的。
打印长度最短的前缀a要删除(擦除),使a成为一个好的数组。请注意,所需的长度可以是0。
你必须回答t个独立的测试用例。
输入
输入的第一行包含一个整数t(1≤t≤2⋅104)-测试用例数。接着是t测试用例。
测试用例的第一行包含一个整数n(1≤n≤2⋅105)-a的长度。测试用例的第二行包含n个整数a1,a2,…,an(1≤ai≤2⋅105),其中ai是a的第i个元素。
保证n之和不超过2⋅105(∑n≤2⋅105)。
输出
对于每个测试用例,打印答案:要使其成为一个好的数组,需要从中删除的元素的最短前缀的长度。
注意
在这个例子的第一个测试用例中,数组a已经很好了,所以我们不需要删除任何前缀。
在本例的第二个测试用例中,初始数组a不是很好。让我们删除a的前4个元素,结果是[4,5,2]。得到的数组是好的。你可以证明,如果你删除的第一个元素的数量较少,结果将不好。
思路:由题意得数组从后往前只能出现一个“山峰”即数字大小先上升后下降的情况,若下降途中出现上升情况则从上升那个位置及以前的数都要除去
#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define eps 1e-6
typedef long long ll;
int a[200020];
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,pos=0,ans=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(int i=n-1;i>=0;i--){
if(a[i]>a[i-1]) pos=1;
if(pos&&a[i]<a[i-1]){
ans=i;
break;
}
}
printf("%d\n",ans);
}
return 0;
}