bzoj 2276: [Poi2011]Temperature——单调队列

Posted 友人A

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\n",ans);
    return 0;
}
View Code

 











以上是关于bzoj 2276: [Poi2011]Temperature——单调队列的主要内容,如果未能解决你的问题,请参考以下文章

bzoj 2276: [Poi2011]Temperature——单调队列

BZOJ2276: [Poi2011]Temperature

bzoj2276: [Poi2011]Temperature(单调队列/堆)

BZOJ2213[Poi2011]Difference DP

BZOJ2529: [Poi2011]Sticks

bzoj2530 [Poi2011]Party