P6510 奶牛排队(单调栈)

利用单调栈求解序列中最长子区间[i, j],其中a[i]是最小值,a[j]是最大值,且长度不为1。通过维护两个单调栈,分别记录小于当前值的最小值下标和大于等于当前值的最大值下标,以找到符合条件的子区间。" 82462537,836063,CentOS 6.10 安装MySQL5.6多实例与mysqld_multi管理,"['Linux系统管理', '数据库管理', 'MySQL安装', '系统配置']
摘要由CSDN通过智能技术生成

传送门

题意:
在这里插入图片描述

给定序列,需要求出一段最长的子区间[i,j]满足,a[i]是严格最小,a[j]是严格最大 ,且长度不能为1,输出该长度。

  • 我们用两个单调栈,minst维护位于a[i]左边且小于a[i]的元素下标,
    maxst维护位于a[i]左边且大于等于a[i]的元素下标

  • 枚举B所在的位置i,然后利用maxst栈得到当前B所在位置往左第一个大于等于B的位置,也就是maxst的栈顶 maxst[top2]于是[maxst[top2]+1,i-1]这段区间每个数都是小于B的。

  • 然后我们只需要找到位于maxst[top2]右边且最近且小于B的元素即可,这些信息都储存在minst

  • 由于单调栈中存的是下标,下标单调递增,对应的值也是单调的,所以可以在minst中二分找到这个位置。

#include<bits/stdc++.h>
using namespace std;
//#pragma GCC optimize(2)
#define ll long long
#define pii pair<int,int>
#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值