zoukankan      html  css  js  c++  java
  • bzoj 2276: [Poi2011]Temperature——单调队列

    Description

    某国进行了连续n天的温度测量,测量存在误差,测量结果是第i天温度在[l_i,r_i]范围内。
    求最长的连续的一段,满足该段内可能温度不降

     第一行n

    下面n行,每行l_i,r_i
    1<=n<=1000000

    一行,表示该段的长度

    Sample Input

    6
    6 10
    1 5
    4 8
    2 5
    6 8
    3 5

    Sample Output

    4
    ————————————————————————————————————
    这道题其实就是维护一个连续的不下降序列
    考虑维护一个队列 对每一个位置 当前位置区间l r
    比l小的路径就弹出 弹出的路劲中取个max就是当前l的答案
    然后就扔进队列里面
    比r大的路劲肯定都不合法 直接扔掉
    然后还在队列里面的路劲答案就+1
    +1的处理可以开一个全局变量
    一条路劲扔进队列里面的时候答案记为v-当前位置
    取出的时候再加上现在的位置就可以了
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using std::max;
    const int M=1e6+7;
    int read(){
        int ans=0,f=1,c=getchar();
        while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();}
        while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();}
        return ans*f;
    }
    int n,l,r,ans;
    int ql=1,qr;
    struct node{int h,v;}q[M];
    int main(){
        n=read();
        for(int i=1;i<=n;i++){
            l=read(); r=read();
            while(ql<=qr&&q[ql].h>r) ql++;
            int h=1-i;
            while(ql<=qr&&q[qr].h<=l) h=max(h,q[qr].v),qr--;
            q[++qr].h=l; q[qr].v=h;
            ans=max(ans,q[ql].v+i);
        }printf("%d
    ",ans);
        return 0;
    }
    View Code
  • 相关阅读:
    问题总结
    Https网络安全架构设计
    分布式ID生成策略
    [转]匿名内部类详解
    JAVA名词解释
    MQ实战
    手写SpringMVC实现
    多线程问答
    BIO、NIO实战
    spring中@Value("${key}")值原样输出${key}分析与解决
  • 原文地址:https://www.cnblogs.com/lyzuikeai/p/7532039.html
Copyright © 2011-2022 走看看