十分套路,一看应该就是LIS相关的题目了
我们发现,操作只能将数字放在数列头,所以考虑一本书i,若有j使得j<i而且s[j]>s[i],那i肯定要被抽出来
所以,答案应该是结尾为n的LIS长度,这个就搞一个rank数组就好了;
找到最小的k使得对于i>=k都满足rank[i]>rank[i-1],那么k-1就是答案
#include#include #include #define N 100010using 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());}