Jzoj4891 摆书
十分套路,一看应该就是LIS相关的题目了
我们发现,操作只能将数字放在数列头,所以考虑一本书i,若有j使得j<i而且s[j]>s[i],那i肯定要被抽出来
所以,答案应该是结尾为n的LIS长度,这个就搞一个rank数组就好了;
找到最小的k使得对于i>=k都满足rank[i]>rank[i-1],那么k-1就是答案
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 100010
using namespace std;
int s[N],r[N],n,T;
int Extended_Ash(){
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",s+i),r[s[i]]=i;
for(int i=--n;i;--i) if(r[i+1]>r[i]) --n; else break;
printf("%d\n",n);
}
int main(){
freopen("book.in","r",stdin);
freopen("book.out","w",stdout);
for(scanf("%d",&T);T--;Extended_Ash());
}