[ 雜題 ] Codeforces946G Almost Increasing Array
阿新 • • 發佈:2018-12-24
如果不能刪除且不是嚴格遞增,答案就是 。
假如嚴格遞增,可以將 減去 ,再求一遍 。
假如可以刪除,因為刪除的點後面的標號會減 ,所以不能直接求 。
設 表示當前是否刪過點,長度為 的序列尾端的最小值,分別用 更新 就好了。
#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;
}