题目大意
给出1到n的排列,每次可把一个数提到队头,求最少次数是序列有序。
解题思路
答案为n-结尾为n的最长连续上升子序列。
code
#include<cstdio>
#include<algorithm>
#define LL long long
#define min(x,y) ((x<y)?x:y)
#define max(x,y) ((x>y)?x:y)
#define fo(i,j,k) for(int i=j;i<=k;i++)
#define fd(i,j,k) for(int i=j;i>=k;i--)
using namespace std;
int const maxn=1e5;
int n,t,a[maxn+10];
int main(){
freopen("book.in","r",stdin);
freopen("book.out","w",stdout);
scanf("%d",&t);
fo(cas,1,t){
scanf("%d",&n);
fo(i,1,n)scanf("%d",&a[i]);
int pre=n,ans=0;
fd(i,n,1){
int j=pre;
for(;j&&(a[j]!=i);j--);
ans+=pre-j;
pre=j-1;
if(pre<1)break;
}
printf("%d\n",ans);
}
return 0;
}