题目描述
现有数列A_1,A_2,cdots,A_NA1,A2,⋯,AN,修改最少的数字,使得数列严格单调递增。
输入输出格式
输入格式:
第1 行,1 个整数N
第2 行,N 个整数A_1,A_2,cdots,A_NA1,A2,⋯,AN
输出格式:
1 个整数,表示最少修改的数字
输入输出样例
说明
• 对于50% 的数据,N le 10^3N≤103
• 对于100% 的数据,1 le N le 10^5 , 1 le A_i le 10^91≤N≤105,1≤Ai≤109
思路:n-最长严格上升子序列。
看数据范围,要用nlogn的求法。
如果有不会用nlogn的方法求的,可以戳这里。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define MAXN 100010 using namespace std; int n,maxn; int a[MAXN],f[MAXN]; int main(){ memset(f,-127,sizeof(f)); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++){ if(a[i]>f[maxn]) f[++maxn]=a[i]; else if(a[i]<f[maxn]){ int l=1,r=maxn; while(l<=r){ int m=(l+r)/2; if(a[i]<f[m]) r=m-1; else if(a[i]==f[m]) break; else l=m+1; } if(f[l]>a[i]) f[l]=a[i]; } } printf("%d",n-maxn); }