【POI2011】TEM-Temperature
阿新 • • 發佈:2018-11-06
題面
某國進行了連續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> usingnamespace 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\n",ans); return 0; }