测量温度(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)"