測量溫度(temperature)----單調佇列
阿新 • • 發佈:2018-12-26
測量溫度(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)"