博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ2276】Temperature
阅读量:5154 次
发布时间:2019-06-13

本文共 4657 字,大约阅读时间需要 15 分钟。

题面

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.

Input

In the first line of the standard input there is one integer \(n(1\le N\le 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\le x\le y\le 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\le x\le y\le 50)\)

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


分析

如果一段区间是可行的,那么显然每一个天\(x\)前面所有的最低温度\(l_y(y<x)\)都应该满足\(r_y\le l_x\)

我们开优先队列来维护当前最长的一段的最低问题的最大值,与当前天的最高温度相比较,所有大于当前天最高温度的所有天都应该出队,并记录当前出队的里面的最大天编号,显然这天之前的所有天数也应该要出队了

#include
#define LL long longusing namespace std;inline char nc(){ /* static char buf[100000],*p1=buf,*p2=buf; if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; } return *p1++; */return getchar();}inline void read(int &x){ char c=nc();int b=1; for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1; for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;}inline void read(LL &x){ char c=nc();LL b=1; for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1; for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;}inline void read(char &x){ for (x=nc();!(x=='('||x==')');x=nc());}inline int read(char *s){ char c=nc();int len=1; for(;!(c=='('||c==')');c=nc()) if (c==EOF) return 0; for(;(c=='('||c==')');s[len++]=c,c=nc()); s[len++]='\0'; return len-2;}int wt,ss[19];inline void print(int x){ if (x<0) x=-x,putchar('-'); if (!x) putchar(48); else { for (wt=0;x;ss[++wt]=x%10,x/=10); for (;wt;putchar(ss[wt]+48),wt--);}}inline void print(LL x){ if (x<0) x=-x,putchar('-'); if (!x) putchar(48); else {for (wt=0;x;ss[++wt]=x%10,x/=10);for (;wt;putchar(ss[wt]+48),wt--);}}int n,m;struct data{ LL x,y; data(LL a=0,LL b=0):x(a),y(b){};}a[1000010];struct cmp{ bool operator()(data x,data y) { if (x.x==y.x) return x.y>y.y; return x.x
,cmp> q;int main(){ read(n); for (int i=1;i<=n;i++) read(a[i].x),read(a[i].y); int ans=0,s=0; for (int i=1;i<=n;i++) { while(!q.empty()&&q.top().x>a[i].y) { s=max(s,(int)q.top().y); q.pop(); } while(!q.empty()&&s>=(int)q.top() .y) q.pop(); q.push(data(a[i].x,(LL)i)); ans=max(ans,i-s); } print(ans),puts(""); return 0;}

转载于:https://www.cnblogs.com/xiejiadong/p/9773239.html

你可能感兴趣的文章
js detect the type of device
查看>>
查看daemon使用技巧
查看>>
jzxx1000~1010题分析
查看>>
Windows Phone 8 与 windows 8 开发技术概览
查看>>
vue 画二维码
查看>>
大数除法(C++)
查看>>
大数乘法(C++)
查看>>
bash常用实例
查看>>
加密配置文件插件
查看>>
文件下载与文件对比
查看>>
pycharm 快捷使用
查看>>
51 Nod 阶乘后面0的数量
查看>>
如何成为编程高手
查看>>
【题解】洛谷P1283 平板涂色(搜索+暴力)
查看>>
BDD(行为驱动开发)
查看>>
socket
查看>>
love2d杂记4--有用的辅助库
查看>>
JAVA中properties基本用法
查看>>
MVC面试问题与答案
查看>>
jQuery分析(3) - jQuery.fn.init
查看>>