如果不能删除且不是严格递增,答案就是
n−最长不下降子序列长度
n
−
最
长
不
下
降
子
序
列
长
度
。
假如严格递增,可以将
ai
a
i
减去
i
i
,再求一遍 。
假如可以删除,因为删除的点后面的标号会减
1
1
,所以不能直接求 。
设
f0/1,i
f
0
/
1
,
i
表示当前是否删过点,长度为
i
i
的序列尾端的最小值,分别用 更新
f0,f1
f
0
,
f
1
就好了。
#include<bits/stdc++.h>
using namespace std;
const int N=200010;
int k,n,m,x,Ans,pos;
int f[2][N];
int main(){
scanf("%d",&n);
memset(f,63,sizeof(f));
f[0][0]=-1e9;
for(int i=1;i<=n;i++){
scanf("%d",&x);
int t=upper_bound(f[1]+1,f[1]+n+1,x-i+1)-f[1];
f[1][t]=x-i+1;Ans=max(Ans,t);
f[1][pos]=min(f[1][pos],f[0][pos]);Ans=max(Ans,pos);
t=upper_bound(f[0]+1,f[0]+n+1,x-i)-f[0];
f[0][pos=t]=x-i;
}
printf("%d\n",max(0,n-Ans-1));
return 0;
}