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());
}

posted @ 2017-11-02 21:37  扩展的灰(Extended_Ash)  阅读(106)  评论(0编辑  收藏  举报