递增
luogu 3902
题目大意:
给出一个序列,问最少修改多少个数字可以使他单调递增
输入样例
3
1 3 2
输出样例
1
数据范围
对于50% 的数据,N≤103N \le 10^3N≤103
对于100% 的数据,1≤N≤105,1≤Ai≤1091 \le N \le 10^5 , 1 \le A_i \le 10^91≤N≤105,1≤Ai≤109
解题思路:
就是求最长上升子序列,但因为数据太大,所以要用o(nlogn)o(n\ log\ n)o(n log n)的方法,具体实现见代码
代码:
#include<cstdio>
using namespace std;
int n,x,num,l,r,mid,a[100100];
int main()
{scanf("%d",&n);scanf("%d",&a[++num]);for (int i=2;i<=n;++i){scanf("%d",&x);if (x>a[num]) a[++num]=x;//比最大的大就直接加else{l=1;r=num;while(l<r)//找不大于x的数中最大的{mid=(l+r)>>1;//二分if (a[mid]<=x) l=mid+1;else r=mid;}a[l]=x;//替换}}printf("%d",n-num);
}