测量温度 [单调队列] 思维题

这篇博客讨论了如何利用单调队列解决一个数据结构问题:寻找连续的温度测量序列,保证序列中所有温度不降。通过分析错误的思路和正确的方法,解释了如何维护一个单调递减的队列来快速找到满足条件的连续段。
摘要由CSDN通过智能技术生成

Description

某国进行了连续N(1<=N<=1000000)天的温度测量,测量存在误差,测量结果是第i天温度在[l_i,r_i]范围内。其中-10 ^ 9<l_i<=r_i<=10 ^ 9
求最长的连续的一段,满足该段内可能温度不降。

Input

第一行一个整数n。

接下来n行,每一行两个整数,表示l_i和r_i。

Output

接下来输出一个整数,表示答案。

Sample Input

6
6 10
1 5
4 8
2 5
6 8
3 5

Sample Output

4

分析

考试的时候没有考虑周到 想的是只要后面那一天有值大于等于前一天即可 也就是前后两天的温度区间第二天的右端点大于等于前一天的左端点即可

看起来没有毛病昂 只要把满足这样条件的天数连在一起就可以了

然而

我还是 too naive

可能会有这样的情况

他们是前后两天两两满足这个条件的 可是第三天却比第一天小

所以:
当前这一天的上限大于等于前面 任意一天的下限

基于此,我们要记录前面温度的下限的最大值,并每次都和当前温度上限进行比较 如果大于 由于要连续 则之前记录的最大值作废
要在后面重新找一个值来作为满足当前这一天的不降区间的起点

如果for一次去找这个当前不降区间的左端点 复杂度会爆掉
那么为了快速找到,我们可以维护一个下限单调递减的单调队列

每一次弹出队头后取值却不能取当前队头元素
队头元素前面可能还有属于当前不降区间的天数。
正确的左端点应该是上一个队头元素(它刚刚被弹出队列)的后一天
后一天不一定会在队列中 而如果后一天不满足当前下限的话 它也一定不会满足上一个下限 那么上一次他就已经有过操作

代码

#include<cstdio>
#include<deque>
using 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值