Codeforces Round #FF (Div. 2) C

来源:互联网 发布:朱棣是朱元璋亲生 知乎 编辑:程序博客网 时间:2024/06/02 12:52

题意:选定一段数,然后可以更改其中的一个 求最长可以得到的严格上升的序列的最长长度


解法:预处理出每个数之前的比他小的数 和 之后比他大的数

然后进行枚举每个点 看是否能组合得到更大的序列长度即可


注意这一题的描述存在bug 数字不一定是要他所规定的范围之内的 出现0、-1 、10^9+n应该也是可以的

所以不用加入太多特判

#include<set>#include<cstdio>#include<iostream>using namespace std;#define maxn 111111int x[maxn],pr[maxn],be[maxn];int main(){    int n;scanf("%d",&n);    for(int i=0;i<n;++i)        scanf("%d",&x[i]);    if(n==1){        printf("1\n");        return 0;    }        int pre=0,ans=0;    pr[1]=1;    for(int i=2;i<n;++i){        if(x[i-1]>x[i-2])pr[i]=pr[i-1]+1;        else pr[i]=1;    }    be[n-2]=1;    for(int i=n-3;i>=0;i--){        if(x[i+2]>x[i+1])be[i]=be[i+1]+1;        else be[i]=1;    }        ans=max(be[0],ans);    ans=max(pr[n-1],ans);    ans=max(be[0]+1,ans);    ans=max(pr[n-1]+1,ans);    for(int i=1;i<n-1;++i){        ans=max(pr[i]+1,ans);        ans=max(be[i]+1,ans);                if(x[i+1]-x[i-1]>=2){            ans=max(pr[i]+be[i]+1,ans);        }    }    printf("%d\n",ans);            return 0;}


0 0
原创粉丝点击