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;
}