递 增 递增 递增
题目链接:luogu P3902
题目
现有数列 A 1 , A 2 , ⋯   , A N A_1,A_2,\cdots,A_N A1,A2,⋯,AN,修改最少的数字,使得数列严格单调递增。
输入
第1 行,
1
1
1 个整数
N
N
N
第2 行,
N
N
N 个整数
A
1
,
A
2
,
⋯
 
,
A
N
A_1,A_2,\cdots,A_N
A1,A2,⋯,AN
输出
1 1 1 个整数,表示最少修改的数字
样例输入
3
1 3 2
样例输出
1
数据范围
对于
50
50%
50 的数据,
N
≤
1
0
3
N \le 10^3
N≤103
对于
100
100%
100 的数据,
1
≤
N
≤
1
0
5
1 \le N \le 10^5
1≤N≤105 ,
1
≤
A
i
≤
1
0
9
1 \le A_i \le 10^9
1≤Ai≤109
思路
这道题用二分来做。
这道题说要问最少要修改多少次,其实答案可以转化成
n
−
n-
n−最长不下降子序列的答案。
当然,直接扫一遍肯定会炸。所以,我们用二分的方法。
(本人手打二分不知道为何
0
0
0分,样例数据都对。然后用
l
o
w
e
r
_
b
o
u
n
d
lower_bound
lower_bound就对了,然后我就不理它了)
代码
#include<cstdio>
#include<algorithm>
using namespace std;
int n,a[100001],b[100001];
int main()
{
scanf("%d",&n);//读入
for (int i=1;i<=n;i++)
{
scanf("%d",&a[i]);//读入
if (a[i]>b[b[0]])
b[++b[0]]=a[i];//可以直接加入队尾
else *lower_bound(b+1,b+b[0]+1,a[i])=a[i];//否则于队列中的一个数进行更替
}
printf("%d",n-b[0]);
return 0;
}