【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; }
“Make my parents proud,and impress the girl I like.”