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

 

posted @ 2017-09-16 18:00  友人Aqwq  阅读(204)  评论(0编辑  收藏  举报