【POI2011】TEM-Temperature

题面

某国进行了连续n天的温度测量,测量存在误差,测量结果是第i天温度在[li,ri]范围内。

求最长的连续的一段,满足该段内可能温度不降。

分析

我们发现要满足这个可能的温度不降,必须避免Li>Rj(i<j)的情况出现。

因此,我们维护L的单调不递减队列,对于每个R,需要找到一个比它小并且距离它最远的L,这就是移动头指针能做到的。

当head移动到L[q[h]]>R[i]不成立时,说明此时的head所在位置的值已经大于了R,因此q[head-1]才是这段区间所在位置

则用i-(q[h-1]+1)+1更新答案

代码

#include<bits/stdc++.h>
using namespace std;
#define N 1000005
int n,t,h,ans;
int q[N],L[N],R[N];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d%d",&L[i],&R[i]);
    t=h=1;q[t++]=1;ans=1;
    for(int i=1;i<=n;i++)
    {
        while(h<t&&L[q[t-1]]<L[i])t--;
        q[t++]=i;
        while(h<t&&L[q[h]]>R[i])h++;
        ans=max(ans,i-(q[h-1]+1)+1);    
    }
    printf("%d
",ans);
    return 0;
}    
原文地址:https://www.cnblogs.com/NSD-email0820/p/9913910.html