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;
}

时间: 2024-11-03 22:01:23

bzoj 2276: [Poi2011]Temperature——单调队列的相关文章

BZOJ 2276 Poi2011 Temperature 单调队列

题目大意:给定一个序列,每个元素的大小有一个取值范围,求一段区间满足区间内元素可能单调不降 对L维护一个单调不增的单调队列,一旦新插入的R值比队头的L值小就把队头弹掉 这样可以保证单调队列中的元素是合法的极大子区间 然后更新答案就行了 乱写读入优化害死人啊QwQ #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 1001001 usi

[BZOJ] 2276: [Poi2011]Temperature

2276: [Poi2011]Temperature Time Limit: 20 Sec  Memory Limit: 32 MBSubmit: 731  Solved: 334[Submit][Status][Discuss] Description The Byteotian Institute of Meteorology (BIM) measures the air temperature daily. The measurement is done automatically, an

BZOJ 1855 股票交易(单调队列优化DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1855 题意:最近lxhgww又迷上了投资股票, 通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第i天的股票买入价为每股APi,第i天的股票卖出价为每股BPi(数据保证对于每 个i,都有APi>=BPi),但是每天不能无限制地交易,于是股票交易所规定第i天的一次买入至多只能购买ASi股,一次卖出至多只能卖出BS

BZOJ 1012 线段树||单调队列

非常裸的线段树  || 单调队列: 假设一个节点在队列中既没有时间优势(早点入队)也没有值优势(值更大),那么显然不管在如何的情况下都不会被选为最大值. 既然它仅仅在末尾选.那么自然能够满足以上的条件. 线段树 #include "stdio.h" #include "string.h" struct node { int l,r,Max; }data[800010]; int Max(int a,int b) { if (a<b) return b; els

BZOJ 2424 订货(贪心+单调队列)

怎么题解都是用费用流做的啊...用单调队列多优美啊. 题意:某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的订货单价为di,上个月月底未销完的单位产品要付存贮费用m,假定第一月月初的库存量为零,第n月月底的库存量也为零,问如何安排这n个月订购计划,才能使成本最低?每月月初订购,订购后产品立即到货,进库并供应市场,于当月被售掉则不必付存贮费.假设仓库容量为S. 首先这道题和经典的汽车加油问题差不多,那道题可以用单调队列做,然而这道题也是可以的. 此题唯一的难点在于存储费用m,也

BZOJ 1855 [Scoi2010]股票交易 单调队列优化DP

题意:链接 方法:单调队列优化DP 解析:噢又是一道情况很多的题,然而三种更新我又落下一种导致样例不过,后来看题解才恍然- -最SB的一种更新居然忘了. 状态好想f[i][j]代表前i天有j双袜子时的最大利润. 三种更新: 第一种:f[i][j]=max(f[i][j],f[i?1][j]):(然而我忘了这一种) 第二种:买入f[i][j]=max(f[i][j],f[i?w?1][k]?(j?k)?a[i].ap)(k>=j?a[i].as); 第三种:卖出f[i][j]=max(f[i][j

BZOJ 2096 Poi2010 Pilots 单调队列

题目大意:给定一个序列,求一个最长的子串,使最大值与最小值之差不超过k 从左到右枚举右端点,利用单调队列维护当前区间中的最大值和最小值 如果某一时刻当前区间的最大值和最小值之差超过了k,就向右调整左端点直到差小于等于k为止 时间复杂度O(n) #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 3003003 using namespa

BZOJ 1012 最大数maxnumber(单调队列)

Description 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度. 2. 插入操作.语法:A n 功能:将n加上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取模,将所得答案插入到数列的末尾.限制:n是非负整数并且在长整范围内.注意:初始时数列是空的,没有一个数. Input 第一行两个整数,M和D,其中M表示操作

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

这题有两种写法,而且是完全(几乎?)不一样的写法...并不是换了个方法来维护而已 单调队列O(N):用一个队列维护a[]的单调递减,对于每个i满足a[队头]<=b[i],然后就可以算出以每一位为结尾的最大答案了 #include<stdio.h> #include<cstring> #include<iostream> #include<cstdlib> using namespace std; const int maxn=1000010,inf=1