2276: [Poi2011]Temperature

2276: [Poi2011]Temperature

Time Limit: 20 Sec  Memory Limit: 32 MB
Submit: 597  Solved: 264
[ 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]



考虑从左往右枚举左端点L,倘若当前能够满足[L,R]的要求,那么L变为L + 1时右端点显然至少为R

对于温度的约束,贪心地想,当然是时刻尽可能保持低温,因为温度过高会让后面的区间难以加入集合

这样确定一个贪心策略,选定区间内的每一天,取每日最低温度和昨日确定的温度中较大者

这样,一段区间处理完,最终温度就是这段区间里最低温中的最大值

用单调队列维护即可


一开始没特判队列为空返回true。。。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
#include<set>
#include<map>
#include<stack>
#include<bitset>
#include<ext/pb_ds/priority_queue.hpp>
using namespace std;
 
const int maxn = 1E6 + 10;
 
int n,Ans,head,tail,r,L[maxn],R[maxn],Q[maxn];
 
int getint()
{
    char ch = getchar(); int ret = 0,a = 1;
    while (ch < '0' || '9' < ch)
    {
        if (ch == '-') a = -1;
        ch = getchar();
    }
    while ('0' <= ch && ch <= '9')
        ret = ret*10 + ch - '0',ch = getchar();
    return ret*a;
}
 
bool Judge(int now)
{
	if (head > tail) return 1;
    return L[Q[head]] <= R[now];
}
 
void Insert(int now)
{
    while (head <= tail && L[Q[tail]] <= L[now])
        --tail; Q[++tail] = now;
}
 
int main()
{
    #ifdef DMC
        freopen("DMC.txt","r",stdin);
    #endif
     
    n = getint(); L[0] = -2E9;
    for (int i = 1; i <= n; i++)
        L[i] = getint(),R[i] = getint();
    head = 1; tail = r = 0;
    for (int i = 1; i <= n; i++)
    {
        while (head <= tail && Q[head] < i) ++head;
        while (r < n && Judge(r + 1)) Insert(++r);
        Ans = max(Ans,r - i + 1);
    }
    cout << Ans;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值