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
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; }
以上是关于bzoj 2276: [Poi2011]Temperature——单调队列的主要内容,如果未能解决你的问题,请参考以下文章
bzoj 2276: [Poi2011]Temperature——单调队列
BZOJ2276: [Poi2011]Temperature
bzoj2276: [Poi2011]Temperature(单调队列/堆)