51Nod1294 修改数组

题目看这里

一个非常好的结论题

发现题目要求要严格递增而且要求要正整数,所以直接做LIS不行

我们令原序列s变为s[i]-i

那么如果s[i]-i是一个负数,肯定不符合题意答案加一

去掉所有负数以后,就可以对s做一个LIS了,这里LIS可以是严格非降的就可以了

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define inf 0x7f7f7f7f
using namespace std;
int f[100010],s[100010],n,t;
int main(){
    memset(f,127,sizeof f);
    scanf("%d",&n);
    for(int i=1;i<=n;++i) scanf("%d",s+i),s[i]-=i;
    for(int i=1;i<=n;++i) if(s[i]>=0) *lower_bound(f,f+n,s[i]+1)=s[i];
    printf("%d\n",n-(lower_bound(f,f+n,inf)-f));
}


posted @ 2018-04-27 16:16  扩展的灰(Extended_Ash)  阅读(157)  评论(0编辑  收藏  举报