poj 2796#单调栈

博客介绍了如何使用单调栈解决POJ 2796问题,主要讨论了两种方法,重点讲解了枚举点寻找最低点的思路,并通过性质分析得出元素扩展的条件。通过代码实现展示了问题的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:

对于这个问题,一般有两种方法:

1。枚举区间,找最小值一般复杂度太高不考虑

2。枚举点,找区间让每个点作为最低点。

对于思路二:

我们有如下的性质:

1. 如果当前元素大于前一元素,那么前一元素能扩展到当前元素,同时说明前面的数对当前元素来说是没有贡献的

2。如果当前元素等于前一元素,那么前一元素也能扩展到当前元素,同时说明前面的元素是可以被忽略的

3。如果当前元素小于前一个元素,那么前面至少有一个元素不能扩展到当前元素的位置,那么这些不能继续扩展的元素的存在显的没有什么意义了,不妨删除它。

我们得到两条结论:

1。一旦一个元素已经进入栈中那么这个元素向左扩展的位置就确定下来了.

2。一旦一个元素出栈被弹出栈,那么这个元素向右扩展的位置也确定下来了.



代码:

/*
单调栈
*/
#include <stdio.h>

#define N 100001

int a[N]
   ,lef[N]  //lef[i] 表示a[i]为最低点的左边界
   ,stack[N]
   ,top;
__int64 sum[N];

int main()
{
    __int64 ans =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值