• codeforces#FF(div2) DZY Loves Sequences


    n个数,能够随意改变当中一个数,求最长的上升子区间长度

    思路:记录一个from[i]表示从位置i的数開始最长的上升区间长度

        记录一个to[i]表示到位置i的数所能达到的最长上升区间长度

    枚举要改变的数的位置i,此时能达到的长度为to[i - 1] + from[i + 1] + 1,取最大值


    //#pragma comment(linker, "/STACK:102400000,102400000")
    //HEAD
    #include <cstdio>
    #include <cstring>
    #include <vector>
    #include <iostream>
    #include <algorithm>
    
    #include <queue>
    #include <string>
    #include <set>
    #include <stack>
    #include <map>
    #include <cmath>
    #include <cstdlib>
    
    using namespace std;
    //LOOP
    #define FE(i, a, b) for(int i = (a); i <= (b); ++i)
    #define FED(i, b, a) for(int i = (b); i>= (a); --i)
    #define REP(i, N) for(int i = 0; i < (N); ++i)
    #define CLR(A,value) memset(A,value,sizeof(A))
    //STL
    #define PB push_back
    //INPUT
    #define RI(n) scanf("%d", &n)
    #define RII(n, m) scanf("%d%d", &n, &m)
    #define RIII(n, m, k) scanf("%d%d%d", &n, &m, &k)
    #define RS(s) scanf("%s", s)
    typedef long long LL;
    const int INF = 0x3f3f3f3f;
    const int MAXN = 1010;
    
    
    #define FF(i, a, b) for(int i = (a); i < (b); ++i)
    #define FD(i, b, a) for(int i = (b) - 1; i >= (a); --i)
    #define CPY(a, b) memcpy(a, b, sizeof(a))
    #define FC(it, c) for(__typeof((c).begin()) it = (c).begin(); it != (c).end(); it++)
    #define EQ(a, b) (fabs((a) - (b)) <= 1e-10)
    #define ALL(c) (c).begin(), (c).end()
    #define SZ(V) (int)V.size()
    #define RIV(n, m, k, p) scanf("%d%d%d%d", &n, &m, &k, &p)
    #define RV(n, m, k, p, q) scanf("%d%d%d%d%d", &n, &m, &k, &p, &q)
    #define WI(n) printf("%d
    ", n)
    #define WS(s) printf("%s
    ", s)
    typedef vector <int> VI;
    typedef unsigned long long ULL;
    const double eps = 1e-10;
    const LL MOD = 1e9 + 7;
    
    int a[100010];
    int to[100010], from[100010];
    
    int main()
    {
        //freopen("0.txt", "r", stdin);
        int n;
        while (~RI(n))
        {
            FE(i, 1, n) RI(a[i]), to[i] = from[i] = 1;
            FE(i, 2, n)
                if (a[i] > a[i - 1])
                    to[i] = to[i - 1] + 1;
            FED(i, n - 1, 1)
                if (a[i + 1] > a[i])
                    from[i] = from[i + 1] + 1;
    //        FE(i, 1, n)
    //            cout << to[i] <<' ';;cout << endl;
    //        FE(i, 1, n)
    //            cout << from[i] <<' ' ; cout << endl;
            int ans = 1;
            if (n > 1)
                ans = max(from[2] + 1, to[n - 1] + 1);
            FE(i, 2, n - 1)
            {
                if (a[i + 1] - a[i - 1] >= 2)
                {
                    if (to[i - 1] + from[i + 1] + 1 > ans)
                    {
                        ans = to[i - 1] + from[i + 1] + 1;
    //                    cout << i <<endl;
                    }
                }
                else
                {
                    ans = max(ans, to[i - 1] +1);
                    ans = max(ans, from[i + 1] + 1);
                }
    
            }
            cout << ans << endl;
        }
        return 0;
    }


  • 相关阅读:
    ajax长轮询实现即时聊天室
    node.js 通过post上传图片并显示
    Java集合类详解
    多行子查询
    Oracle中查看用户下面所有表的语句
    关于Oracle的create
    Oracle数据库学习
    oracle数据库
    js 中 undefined、NaN、null
    学习数据库SQL语句2
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/6773452.html
Copyright © 2020-2023  润新知