bzoj2276 Temperature
2016-02-15 07:59
288 查看
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. Themeasurements 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 Byteotiacould have been not dropping.
一行,表示该段的长度
Sample Input
66 10
1 5
4 8
2 5
6 8
3 5
Sample Output
4HINT
Source
Dp单调队列优化考虑若干个 l – r 区间,如果这几个区间的温度可能不降,min { l } 是可以被取到的
那么只要维护关于l的单调递减队列,保证队头的 l 小等于队尾的 r。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#define ll long long
#define INF 0x7f7f7f7f
using namespace std;
struct Node
{
int l, r;
}a[1000010];
int n,x = 1,y,ans;
int q[1000010];
int main()
{
scanf("%d",&n);
for(int i = 1; i <= n; i ++)
scanf("%d%d",&a[i].l, &a[i].r);
for(int i = 1; i <= n; i ++)
{
while(a[q[x]].l > a[i].r && x <= y)x ++;
if(x <= y) ans = max(ans,i - q[x] + 1);
int t = i;
while(a[i].l > a[q[y]].l && x <= y)t = q[y], y --;
a[t].l = a[i].l;
q[++ y] = t;
}
printf("%d\n",ans);
return 0;
}
相关文章推荐
- error at ::0 can't find referenced pointcut解决办法(转载)
- 不要放弃治疗
- 从零开始山寨Caffe·壹:仰望星空与脚踏实地
- bzoj1010 玩具装箱toy
- 卡夫卡作品研究
- 【BZOJ 1497】 [NOI2006]最大获利
- oracle中查询、禁用、启用、删除表外键
- 创业的第一百二十天
- 【BZOJ 1015】[JSOI2008]星球大战starwar
- BZOJ 4401: 块的计数|树分块
- Spring AOP(注解方式)
- 【BZOJ 1934】 [Shoi2007]Vote 善意的投票
- 想跳槽?先看什么是好工作
- 还原数据库,数据库提示正在还原中的处理办法
- 【BZOJ 1798】 [Ahoi2009]Seq 维护序列seq
- 【BZOJ 1834】 [ZJOI2010]network 网络扩容
- 4197: [Noi2015]寿司晚宴 思路题 状压DP
- 【BZOJ [1878】[SDOI2009]HH的项链
- 【BZOJ 2744 】[HEOI2012]朋友圈
- 他们是如何利用人们的好奇心赚钱的?