1. 程式人生 > >測量溫度(temperature)----單調佇列

測量溫度(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)"