• 波浪子序列 (Wavio Sequence,UVa 10534)


     1 #include <iostream>
     2 #include <string.h>
     3 #include <string>
     4 #include <fstream>
     5 #include <algorithm>
     6 #include <stdio.h>
     7 #include <vector>
     8 #include <queue>
     9 #include <set>
    10 #include <cmath>
    11 using namespace std;
    12 const double eps = 1e-8;
    13 const int INF=0x7fffffff;
    14 #define MAXN 10002
    15 
    16 int main()
    17 {
    18     int a[MAXN];
    19     int n;
    20     int g[MAXN];
    21     int up[MAXN],down[MAXN];
    22     while(scanf("%d",&n)!=EOF)
    23     {
    24         for(int i=0;i<n;i++)
    25         scanf("%d",&a[i]);
    26         int ans=-1;
    27         for(int i=0;i<=n;i++)g[i]=INF;
    28         for(int i=0;i<n;i++)
    29         {
    30         int k=lower_bound(g+1,g+n+1,a[i])-g;
    31         up[i]=k;
    32         g[k]=a[i];
    33         }
    34 
    35         for(int i=0;i<=n;i++)g[i]=INF;
    36         for(int i=n-1;i>=0;i--)
    37         {
    38         int k=lower_bound(g+1,g+n+1,a[i])-g;
    39         down[i]=k;
    40         g[k]=a[i];
    41         }
    42 
    43         for(int i=0;i<n;i++)
    44         {
    45             ans=max(ans,min(up[i],down[i])*2-1);
    46         }
    47         printf("%d
    ",ans);
    48     }
    49     return 0;
    50 }

    刘汝佳的 O(nlogn) 的 LIS 算法

    lower_bound(first,last,value)在first和last中的前闭后开区间进行二分查找,返回大于或等于value的第一个元素位置。如果所有元素都小于val,则返回last的位置。

  • 相关阅读:
    过河卒 NOIp 2002 dp
    [POI2014]KUR-Couriers BZOJ3524 主席树
    【模板】可持久化线段树 1(主席树)
    EXPEDI
    取石子游戏 BZOJ1874 博弈
    【模板】文艺平衡树(Splay) 区间翻转 BZOJ 3223
    关于表白
    POJ 1951
    Codeforces 1032F Vasya and Maximum Matching dp
    Codeforces 1016F Road Projects
  • 原文地址:https://www.cnblogs.com/TO-Asia/p/3200178.html
Copyright © 2020-2023  润新知