ACM二招补题Day 3 || F_矩形面积

F_矩形面积

F_矩形面积

方法:单调栈

思路:

单调栈是具有单调性的栈,为了维护单调性就需要每次入栈前判断待入元素与栈顶元素的大小,将小于(单调递减栈)或大于(单调递增栈)的栈顶元素拿出后放入当前元素。

(有没有发现调整判定与单调性一致,单调递减就需要把栈顶小于当前元素的都拿出来,单调递增就需要把大于当前元素的都拿出来)

应用:寻找在左边或右边第一个大于或小于当前目标的元素

(单调递增栈用于寻找左右第一个小于的元素,单调递减栈用于寻找左右第一个大于的元素)

(丑丑的代码)

#include <stdio.h>
#define N 100000
typedef long long int i64;

int main(void)
{
    i64 n;
    scanf("%lld", &n);
    i64 stack[N] = {0}, a[N];
    i64 L[N] = {0};
    i64 R[N] = {0};
    i64 top = -1, p = -1;
    for (i64 i = 0; i < n + 1; i++)
    {
        if (i != n)
            scanf("%d", &a[i]);
        else
            a[i] = 0;
        while (top != -1 && a[p] >= a[i])
        {
            R[p] = i;
            top--;
            if (top != -1)
                p = stack[top];
        }
        L[i] = p;
        stack[++top] = i;
        p = stack[top];
    }
    i64 max = 0, s = 0;
    i64 l, r;
    for (i64 i = 0; i < n; i++)
    {
        l = L[i];
        r = R[i];
        if (l == -1)
        {
            s = (r - 1) * a[i];
            max = (s > max) ? s : max;
        }
        else
        {
            s = (r - l - 1) * a[i];
            max = (s > max) ? s : max;
        }
    }
    printf("%lld\n", max);
    return 0;
}

全部评论

相关推荐

03-06 18:20
门头沟学院 Java
点赞 评论 收藏
分享
03-03 23:12
已编辑
北京邮电大学 Java
书海为家:我来给一点点小建议,因为毕竟还在学校不像工作几年的老鸟有丰富的项目经验,面试官在面试在校生的时候更关注咱们同学的做事逻辑和思路,所以最好在简历中描述下自己做过项目的完整过程,比如需求怎么来的,你对需求的解读,你想到的解决办法,遇到困难如何找人求助,最终项目做成了什么程度,你从中收获了哪些技能,你有什么感悟。
你的简历改到第几版了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务