1. 程式人生 > >bzoj 2276: [Poi2011]Temperature——單調隊列

bzoj 2276: [Poi2011]Temperature——單調隊列

連續 none input per open 路徑 span inpu 位置

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——單調隊列