您的位置:首页 > 其它

bzoj 2276: [Poi2011]Temperature(单调队列)

2016-11-10 11:38 381 查看

2276: [Poi2011]Temperature

Time Limit: 20 Sec  Memory Limit: 32 MB

Submit: 560  Solved: 248

[Submit][Status][Discuss]

Description

The Byteotian Institute of Meteorology (BIM) measures the air temperature daily. The measurement is done automatically, and its result immediately printed. Unfortunately, the ink in the printer has long dried
out... The employees of BIM however realised the fact only recently, when the Byteotian Organisation for Meteorology (BOM) requested access to that data.
An eager intern by the name of Byteasar saved the day, as he systematically noted down the temperatures reported by two domestic alcohol thermometers placed on the north and south outside wall of the BIM building.
It was established decades ago by various BIM employees that the temperature reported by the thermometer on the south wall of the building is never lower than the actual temperature, while that reported by the thermometer on the north wall of the building
is never higher than the actual temperature. Thus even though the exact temperatures for each day remain somewhat of a mystery, the range they were in is known at least.
Fortunately for everyone involved (except Byteasar and you, perhaps), BOM does not require exact temperatures. They only want to know the longest period in which the temperature was not dropping (i.e. on each
successive day it was no smaller than on the day before). In fact, the veteran head of BIM knows very well that BOM would like this period as long as possible. To whitewash the negligence he insists that Byteasar determines, based on his valuable notes, the
longest period in which the temperature could have been not dropping. Now this is a task that Byteasar did not quite expect on his BIM internship, and he honestly has no idea how to tackle it. He asks you for help in writing a program that
determines the longest such period.
某国进行了连续n天的温度测量,测量存在误差,测量结果是第i天温度在[l_i,r_i]范围内。

求最长的连续的一段,满足该段内可能温度不降。

Input

In the first line of the standard input there is one integer n(1<=N<=1000000) that denotes the number of days for which Byteasar took notes on the temperature. The measurements from day are given in the line
no.i+1 Each of those lines holds two integers, x and y (-10^9<=x<=y<=10^9). These denote, respectively, the minimum and maximum possible temperature on that particular day, as reported by the two thermometers.
In some of the tests, worth 50 points in total, the temperatures never drop below -50 degrees (Celsius, in case you wonder!) and never exceeds 50 degrees (-50<=x<=y<=50)  
第一行n

下面n行,每行l_i,r_i

1<=n<=1000000

Output

In the first and only line of the standard output your program should print a single integer, namely the maximum number of days for which the temperature in Byteotia could have been not dropping.
一行,表示该段的长度

Sample Input

6

6 10

1 5

4 8

2 5

6 8

3 5

Sample Output

4

HINT





Source



[Submit][Status][Discuss]

题解:单调队列

一个点i向前能延伸到的最远的点不会远于他前边的点

也就是说在tail单调的情况下,head也是单调的(一定不会向前移),那么如果一段区间是满足条件的,那么这段区间的l的最小值一定大于区间中任意r的值,否则一定不成立。那么我们考虑顺序加入每个点,维护l的值单调递增,这样head的l一定就是区间的最小值。如果此时l[q[head]]>r[i]那么就将队首元素出队。更新的时候用i-q[head-1]来更新,为啥是head-1,因为队列中存的是位置,因为保持队列单调,所以有些位置不在队列中,但是这些不是单调的位置他后面的位置满足他必然满足,当我们弹出最后一个不满足条件的位置后,q[head-1]+1开始就都满足了,所以是i-(q[head-1]+1)+1.

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define N 1000003
using namespace std;
int n,a
,b
,q
,q1
,pos
,head,tail,l,r;
int main()
{
freopen("a.in","r",stdin);
freopen("my.out","w",stdout);
scanf("%d",&n); int ans=0;
head=1;
for (int i=1;i<=n;i++) {
scanf("%d%d",&a[i],&b[i]);
while(head<=tail&&a[q[tail]]<=a[i]) tail--;
q[++tail]=i;
while (head<=tail&&a[q[head]]>b[i]) head++;
ans=max(ans,i-q[head-1]);
}
printf("%d\n",ans);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: