链接
https://www.luogu.org/problemnew/show/P3902
大意
求将一个序列转换为严格
递增序列的最小次数
思路
求出一个最长上升的子序列,剩下的元素个数即为要修改的次数,由于数据很大,我们需要用到 的方法,其实,在二分查找的每次替换中就可以当作一次修改操作,我们可以利用这个特性直接求出答案,而不必用 去减
代码
#include<cstdio>
#include<algorithm>
#define r(i,a,b) for(register int i=a;i<=b;i++)
using namespace std;int a,n,f[100001],ans,len;
int main()
{
scanf("%d",&n);
r(i,1,n)
{
scanf("%d",&a);
if(a>f[len]) f[++len]=a;
else *lower_bound(f+1,f+1+len,a)=a,ans++;//统计修改次数
}
printf("%d",ans);
}