逐·渐·中·二
拒绝大魔王,来一道简单点的题怪水一水。
怪物种类:最长上升子序列
等级:橙题(shui(bu
打怪攻略:
1.用一个序列s存最长上升子序列,然后对于一个新的数a,如果它大于序列末尾的数,那么序列s末尾就接上a。
2.不然就在序列s中找一个sl<a<=sr的位置,将a存到r位置上。
答案就是序列最长的长度。
此怪非模板,需要输出用n减去序列最长长度。
#include<cstdio>
#include<iostream>
using namespace std;
int n,a,t,ans[100003],maxx;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d",&a); //读入
if(a>ans[t]){ //如上1
++t;
ans[t]=a;
maxx=max(maxx,t);
}
else{ //如上2,二分查找那个位置。
int l=1,r=t;
while(l<r){
int mid=(l+r)>>1;
if(ans[mid]<a) l=mid+1;
else r=mid;
}
ans[l]=a; //存
}
}
printf("%d",n-maxx); //输出
}