1. 程式人生 > >[ 雜題 ] Codeforces946G Almost Increasing Array

[ 雜題 ] Codeforces946G Almost Increasing Array

如果不能刪除且不是嚴格遞增,答案就是 n
假如嚴格遞增,可以將 ai 減去 i ,再求一遍 LIS
假如可以刪除,因為刪除的點後面的標號會減 1 ,所以不能直接求 LIS
f0/1,i 表示當前是否刪過點,長度為 i 的序列尾端的最小值,分別用 aii,aii+1 更新 f0,f1 就好了。

#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; }