zoukankan      html  css  js  c++  java
  • BZOJ2276: [Poi2011]Temperature

    2276: [Poi2011]Temperature

    Time Limit: 20 Sec  Memory Limit: 32 MB
    Submit: 293  Solved: 117
    [Submit][Status]

    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

    题解:

    类似与pilots,我们可以枚举右端点 i,那么左端点 l[i]一定是单调不减的,那么就可以使用单调队列。

    那么如何判断当前连续一段是否能单调不减呢?注意到如果x能被到达,那么所有y>x也一定能到达,而x就是这一段中温度最小值的最大值!

    因为在到达该点之前,必须上升到x,之后又无法下降,所以合法的下界一定是这段区域里的温度最小的最大值,当然如果该值>当前i的上界,将队首元素弹出。

    也就是说维护一个最小值单调递减的单调队列。

    代码:

     1 #include<cstdio>
     2 
     3 #include<cstdlib>
     4 
     5 #include<cmath>
     6 
     7 #include<cstring>
     8 
     9 #include<algorithm>
    10 
    11 #include<iostream>
    12 
    13 #include<vector>
    14 
    15 #include<map>
    16 
    17 #include<set>
    18 
    19 #include<queue>
    20 
    21 #include<string>
    22 
    23 #define inf 1000000000
    24 
    25 #define maxn 1000000+5
    26 
    27 #define maxm 500+100
    28 
    29 #define eps 1e-10
    30 
    31 #define ll long long
    32 
    33 #define pa pair<int,int>
    34 
    35 #define for0(i,n) for(int i=0;i<=(n);i++)
    36 
    37 #define for1(i,n) for(int i=1;i<=(n);i++)
    38 
    39 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
    40 
    41 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
    42 
    43 #define mod 1000000007
    44 
    45 using namespace std;
    46 
    47 inline int read()
    48 
    49 {
    50     int x=0,f=1;char ch=getchar();
    51 
    52     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    53 
    54     while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();}
    55 
    56     return x*f;
    57 
    58 }
    59 int n,ans=1,l=1,r=0,now,last=1,a[maxn],b[maxn],q[maxn];
    60 
    61 int main()
    62 
    63 {
    64 
    65     freopen("input.txt","r",stdin);
    66 
    67     freopen("output.txt","w",stdout);
    68 
    69     n=read();
    70     for1(i,n)
    71     {
    72         a[i]=read();b[i]=read();
    73         while(l<=r&&a[q[r]]<=a[i])r--;
    74         q[++r]=i;
    75         now=last;
    76         while(a[q[l]]>b[i])now=q[l++]+1;
    77         ans=max(ans,i-now+1);
    78         last=now;
    79     }
    80     printf("%d
    ",ans);
    81 
    82     return 0;
    83 
    84 }
    View Code
  • 相关阅读:
    POJ2888 Magic Bracelet [矩阵快速幂+Burnside+欧拉函数]
    数列的 GCD [计数问题]
    com组件的注册
    WCF 传输和接受大数据
    数据库中已存在名为 'View_Business' 的对象。
    windows 两个用户,默认其中一个用户登录
    用C#读取,写入ini文件
    小心得,关于串口
    未能加载文件或程序集"Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad
    无法激活服务,因为它不支持 ASP.NET 兼容性
  • 原文地址:https://www.cnblogs.com/zyfzyf/p/4010918.html
Copyright © 2011-2022 走看看