zoukankan      html  css  js  c++  java
  • 栈的应用

    POJ2559http://poj.org/problem?id=2559

    求一系列不等高的柱状体中最大的长方形面积

    思路:答案中的长方形必定有至少有一条边与其中一个柱状体的顶边重合。那么我们只需求解对于每个柱状体,它最多能向左右延伸多长。

    设当前柱状体下标为j (0 <= j < n)

    L[i] = (j <= i 且 h[j - 1] < h[i]的最大的j)(左闭)

    R[i] = (j > i 并且h[j] > h[i]的最小的j)(右开)

    ans = max{h[i] * (R[i] - L[i])}

    在计算L[i]时,若柱状体左端高度高于其,则其左端的所有柱状体高度没有意义。

    运用栈,栈中的元素从上到下的值为x[i], 则x[i] > x[i + 1] 且h[x[i]] > h[x[i + 1]]

     在计算L[i]时,首先,当栈顶的元素j满足h[j] >= h[i], 则不断取出栈顶元素。

    如栈的为空,则L[i] = 0; 若h[j] < h[i], 则L[i] = j + 1。然后把i压入栈中。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    #include <vector>
    #define INF 0x3f3f3f3f
    #define mod 1000000007
    typedef long long LL;
    using namespace std;
    
    const int maxn = 100000 + 10;
    int hei[maxn];
    int s[maxn], l[maxn], r[maxn];
    
    int N;
    LL ans;
    
    int main(int argc, const char * argv[]) {
        while (~scanf("%d", &N) && N) {
            memset(hei, 0, sizeof(hei));
            memset(l, 0, sizeof(l));
            memset(r, 0, sizeof(r));
            for (int i = 0; i < N; i++) {
                scanf("%d", &hei[i]);
            }
            int t = 0;
            for (int i = 0; i < N; i++) {
                while (t > 0 && hei[s[t - 1]] >= hei[i]) t--;
                if (t == 0) {
                    l[i] = 0;
                } else {
                    l[i] = s[t - 1] + 1;
                }
                s[t++] = i;
            }
            t = 0;
            for (int i = N - 1; i >= 0; i--) {
                while (t > 0 && hei[s[t - 1]] >= hei[i]) t--;
                if (t == 0) {
                    r[i] = N;
                } else {
                    r[i] = s[t - 1];
                }
                s[t++] = i;
            }
            
            ans = -1;
            for (int i = 0; i < N; i++) {
                LL tmp = (LL)hei[i] * (LL)(r[i] - l[i]);
                ans = max(ans, tmp);
            }
            printf("%lld
    ", ans);
            
        }
        return 0;
    }
    View Code
  • 相关阅读:
    linux系统安装mysql数据库
    pyinstaller打包问题
    jmeter-Parameters和Body Data两种方式传参的区别
    jmeter-保存响应到文件
    Jenkins获取运行job的用户信息
    pytest插件(多重校验、用例依赖、执行顺序、失败重跑、重复执行、标记)
    谷歌开发者工具(F12)
    Linux常用命令
    一般什么原因会导致偶现问题?
    Fiddler模拟接口返回进行测试(二)
  • 原文地址:https://www.cnblogs.com/xFANx/p/6884494.html
Copyright © 2011-2022 走看看