UVA

来源:互联网 发布:欧德堡牛奶怎么样 知乎 编辑:程序博客网 时间:2024/05/01 22:25

乍一看不好下手
稍微一想就能想到 从左右两边分别求 LIS,可能数据量比较大,这里的用的
O(n*log n)的做法
还有题目已经要求了 上升下降的长度相等
所以就有 solve()函数中最后枚举每个点的时候,取最小的那个
代码如下:

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<set>#include<stack>#include<queue>#include<algorithm>// cout << "  ===  " << endl;using namespace std;typedef long long ll;const int maxn = 100000 + 7, INF = 0x3f3f3f3f, mod = 1e9+7;int T, n, p, q, ans;int a[maxn], b[maxn], c[maxn], d[maxn];void solve() {    memset(d, INF, sizeof d);    for(int i = 0; i < n; ++i) {        *lower_bound(d, d+n+1, a[i]) = a[i];        b[i] = lower_bound(d, d+n+1, INF) - d;    }    memset(d, INF, sizeof d);    for(int i = n-1; i >= 0; --i) {        *lower_bound(d, d+n+1, a[i]) = a[i];        c[i] = lower_bound(d, d+n+1, INF) - d;    }    int ans = 0;    for(int i = 0; i < n; ++i) {        ans = max(ans, min(b[i], c[i]));    }    printf("%d\n", 2*ans - 1);}int main() {    while(scanf("%d", &n) != EOF && n) {        for(int i = 0; i < n; ++i)            scanf("%d", &a[i]);        solve();    }    return 0;}
原创粉丝点击