1. 程式人生 > >【POI2011】TEM-Temperature

【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\n",ans); return 0; }