zoukankan      html  css  js  c++  java
  • 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;
    }


  • 相关阅读:
    Codeforces 451A Game With Sticks
    POJ 3624 Charm Bracelet
    POJ 2127 Greatest Common Increasing Subsequence
    POJ 1458 Common Subsequence
    HDU 1087 Super Jumping! Jumping! Jumping!
    HDU 1698
    HDU 1754
    POJ 1724
    POJ 1201
    CSUOJ 1256
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/6773452.html
Copyright © 2011-2022 走看看