题目描述
现有数列A1,A2,⋯,AN,修改最少的数字,使得数列严格单调递增。
输入输出格式
输入格式:
第1 行,1 个整数N
第2 行,N 个整数A1,A2,⋯,AN
输出格式:
1 个整数,表示最少修改的数字
输入输出样例
输入样例#1: 复制
3
1 3 2
输出样例#1: 复制
1
说明
• 对于50% 的数据,N≤10^3
• 对于100% 的数据,1≤N≤105,1≤Ai≤10^9
#include<bits/stdc++.h>
using namespace std;
const int maxn=100010;
int n,a[maxn],f[maxn],ans,num;
int erf(int l,int r,int x)
{
while(l<=r)
{
int mid=(l+r)/2;
if(f[mid]>=x)
{
r=mid-1;
}
else
{
l=mid+1;
}
}
return l;
}
int main()
{
scanf("%d",&n);
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
f[1]=a[1];
ans=1;
for(int i=2;i<=n;i++)
{
if(f[ans]<a[i])
{
f[++ans]=a[i];
}
else
{
num=erf(1,ans,a[i]);
f[num]=a[i];
}
}
//ans为单调递增子序列的长度
cout<<n-ans<<endl;
return 0;
}