对单调栈的理解

最常规的无外乎 O ( n ) O(n) O(n) 求对于位置 i i i a j < a i ( j < i ) a_j<a_i(j<i) aj<ai(j<i) 的最大 j j j
在这里插入图片描述
我们可以这样想:
在这里插入图片描述
如果是这样一个单调递增栈我们发现无论 a i a_i ai 的变化我们决策始终是栈顶元素,于是栈顶以下的元素全部被包含,是不合理的,不会成为决策点
在这里插入图片描述
对于位置 i i i a j < a i ( j < i ) a_j<a_i(j<i) aj<ai(j<i) 的最大 j j j 此时红箭头以上部分不会 i i i 后面决策点,于是将他们 p o p pop pop 掉后 i i i 会成为新的决策点
但是如果有系数呢,即求 a j < k a i ( j < i , k > 1 ) a_j<ka_i(j<i,k>1) aj<kai(j<i,k>1) 的最大 j j j
在这里插入图片描述
我们依旧可以 O ( n ) O(n) O(n) 出解,因为这里我们可以先查询在修改,而对于后面此时 [ j 2 , t p ] [j_2,tp] [j2,tp] 是没有 i i i 优的,于是可以先查询 j 1 j_1 j1 再到 j 2 j_2 j2

换一个问题,求 k a j < a i ( j < i , k > 1 ) ka_j<a_i(j<i,k>1) kaj<ai(j<i,k>1) 的最大 j j j
在这里插入图片描述
我们发现此时似乎无法单调,因为你并不能把 [ j 1 , t p ] [j_1,tp] [j1,tp] 删除完,考虑后面又来了一个查询 [ j 1 , j 2 ] [j_1,j_2] [j1,j2] 是可能作为答案的
但是 [ j 2 , t p ] [j_2,tp] [j2,tp] 是肯定要删除的,因为此时肯定选 i i i
此时对于查询我们依旧可以维护单调栈,但是可以变为二分
针对上面2种问题,为什么前一种是 O ( n ) O(n) O(n) 而后一种是 O ( n l o g n ) O(nlogn) O(nlogn) ,发现前一种的查询点总会被此次弹出每次选择栈顶作为决策点,而后一种的查询点不一定在删除点中,要保留,于是决策点不一定是栈顶需要二分。
其实可以 O ( n l o g n ) O(nlogn) O(nlogn) 处理询问的

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值