测量温度(temperature)----单调队列

测量温度(temperature)

题目描述

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

输入

第一行一个整数n。

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

输出

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

样例输入

6 10
1 5
4 8
2 5
6 8

样例输出

4

方法

解析

先理解好题意:"可能温度不降"是什么意思? 正面讲不太懂,但反过来讲,意思就是如果那一段日子内温度必然会降,则不符合要求。就是说如果今天的最高温不小于昨天的最低温,那这两天温度就可能不降。但如果要判断第i天对于前一段日子温度是否下降,应该把他的最高温与前一段日子的所有最低温中的最高温比较,≥则把i算进去,<则说明第i天的温度对于前一段日子中的某一天(以下记为第j天)必定会下降,那么以i为最后一天的符合要求的区间就只能在(j+1,i)中了。

那么用单调队列就很好解决了。队列每个元素存下标,以每一天的最低温维护递减关系。代码如下,已理解的就不必看了。

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,i,j,lo[1000005],hi[1000005],k;
int f[1000005],l,r,h;
int main()
{
    scanf("%d",&n);
    for(i=1;i<=n;i++)scanf("%d%d",&lo[i],&hi[i]);
    f[0]=1;r=1;h=1;
    for(i=2;i<=n;i++){
        while(r>l&&lo[f[l]]>hi[i])h=f[l]+1,l++;
        k=max(k,i-h+1);
        while(r>l&&lo[f[r-1]]<lo[i])r--;
        f[r++]=i;
    }
    printf("%d",k);
    putchar('\n');
    return 0;
}

很简短对不对?

结束

欢迎关注CSDN "偶耶(xiong j x)"

猜你喜欢

转载自blog.csdn.net/weixin_43960287/article/details/85048245