码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-09-16 20:51:56      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:zoj   return   pen   font   位置   style   ==   sam   play   

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——单调队列

标签:zoj   return   pen   font   位置   style   ==   sam   play   

原文地址:http://www.cnblogs.com/lyzuikeai/p/7532039.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!