对于单调队列的基本概念可以去看百科里的相关介绍:http://baike.baidu.com/view/3771451.htm

这里挑一些重点。

作用:

不断地向缓存数组里读入元素,也不时地去掉最老的元素,不定期的询问当前缓存数组里的最小的元素。
最直接的方法:普通队列实现缓存数组。
进队出队都是O(1),一次查询需要遍历当前队列的所有元素,故O(n)。

RMQ即Range Maximum(Minimum) Query,用来求某个区间内的最大值或最小值。使用线段树或稀疏表是O(log(n))级的。对于这类问题这两种方法也搞得定,但是没有单调队列快。

定位:

大多数题目为单调队列力所不能及的,取而代之的是单调队列基础上改进的斜率优化,单调栈等,因为其限制条件,故潜力不大。但需要掌握,因为有许多算法建立在其基础上。

简单说就是基础,得会。

poj 2823

http://acm.hust.edu.cn/vjudge/problem/16694

k大小的滑动窗口,求每次窗口中最大值和最小值

思路:

维护单增队列和单减队列,因为滑动窗口和index有关,所以加个index数组维护head的索引

#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>
#include <cctype>
#include <vector>
#include <iterator>
#include <set>
#include <map>
#include <sstream>
using namespace std; #define mem(a,b) memset(a,b,sizeof(a))
#define pf printf
#define sf scanf
#define spf sprintf
#define pb push_back
#define debug printf("!\n")
#define MAXN 1000000+5
#define MAX(a,b) a>b?a:b
#define blank pf("\n")
#define LL long long
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
#define pqueue priority_queue
#define INF 0x3f3f3f3f #define ls (rt<<1)
#define rs (rt<<1|1) int n,m,k; int a[MAXN],qu[MAXN],index[MAXN],ans[MAXN]; void getMin()
{
int head=,tail=;
for(int i =;i<k;i++)
{
while(head<=tail && a[i]<=qu[tail]) tail--;
qu[++tail] = a[i];
index[tail] = i;
}
for(int i=k;i<=n;i++)
{
while(head<=tail && a[i]<=qu[tail]) tail--;
qu[++tail] = a[i];
index[tail] = i;
while(index[head]<= i-k) head++;
ans[i-k] = qu[head];
}
} void getMax()
{
int head=,tail=;
for(int i =;i<k;i++)
{
while(head<=tail && a[i]>=qu[tail]) tail--;
qu[++tail] = a[i];
index[tail] = i;
}
for(int i =k;i<=n;i++)
{
while(head<=tail && a[i]>=qu[tail]) tail--;
qu[++tail] = a[i];
index[tail] = i;
while(index[head]<= i-k) head++;
ans[i-k] = qu[head];
}
} int main()
{
int i,j,t,kase=;
while(~sf("%d%d",&n,&k))
{
for(i=;i<=n;i++) sf("%d",&a[i]);
getMin();
for(i=;i<=n-k;i++) pf("%d ",ans[i]);
blank;
getMax();
for(i=;i<=n-k;i++) pf("%d ",ans[i]);
blank;
}
return ;
}

ACM-单调队列的更多相关文章

  1. ACM学习历程—HDU 5289 Assignment(线段树 || RMQ || 单调队列)

    Problem Description Tom owns a company and he is the boss. There are n staffs which are numbered fro ...

  2. 【简洁易懂】CF372C Watching Fireworks is Fun dp + 单调队列优化 dp优化 ACM codeforces

    题目大意 一条街道有$n$个区域. 从左到右编号为$1$到$n$. 相邻区域之间的距离为$1$. 在节日期间,有$m$次烟花要燃放. 第$i$次烟花燃放区域为$a_i$ ,幸福属性为$b_i$,时间为 ...

  3. BestCoder Round #89 B题---Fxx and game(单调队列)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5945     问题描述 输入描述 输出描述 输入样例 输出样例 题意:中文题,不再赘述: 思路:  B ...

  4. 单调队列 && 斜率优化dp 专题

    首先得讲一下单调队列,顾名思义,单调队列就是队列中的每个元素具有单调性,如果是单调递增队列,那么每个元素都是单调递增的,反正,亦然. 那么如何对单调队列进行操作呢? 是这样的:对于单调队列而言,队首和 ...

  5. FZU 1914 单调队列

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=1914 题意: 给出一个数列,如果它的前i(1<=i<=n)项和都是正的,那么这个数列是正的,问这个 ...

  6. 【HDU 3401 Trade】 单调队列优化dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3401 题目大意:现在要你去炒股,给你每天的开盘价值,每股买入价值为ap,卖出价值为bp,每天最多买as ...

  7. HDU 3401 Trade dp+单调队列优化

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3401 Trade Time Limit: 2000/1000 MS (Java/Others)Mem ...

  8. HDU-3401 Trade 单调队列优化DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3401 DP方程容易想出来,f[i][j]表示第i天拥有j个股票的最优解,则: 1.不买不卖,f[i][ ...

  9. HDU 4122 Alice's mooncake shop 单调队列优化dp

    Alice's mooncake shop Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem ...

  10. hdu4374One hundred layer (DP+单调队列)

    http://acm.hdu.edu.cn/showproblem.php?pid=4374 去年多校的题 今年才做 不知道这一年都干嘛去了.. DP的思路很好想 dp[i][j] = max(dp[ ...

随机推荐

  1. [poj 2106] Boolean Expressions 递归

    Description The objective of the program you are going to produce is to evaluate boolean expressions ...

  2. 总结一下vue里一些小技巧

    官方里的我就不细说了,自个撸文档就成,下面是实践里常用的几个小技巧或者说是遇到的坑,若有错误望大家指正)1.当用a标签设置新窗口打开页面,设置url时,建议给href进行v-bind绑定,然后写相对路 ...

  3. Nginx入门介绍与安装

    Nginx是什么? Nginx是俄罗斯人编写的十分轻量级的HTTP和反向代理服务器.发音:"engine X" Nginx能干什么? (1)Http反向代理 Nginx 支持正则表 ...

  4. 从理论认识J2EE

    前言 在学习J2EE这块,看了成套的视频,感觉,感觉,感觉收获不是特别大,没用马老师讲得好,但是多少还是和J2EE打了个招呼,比如J2EE著名的十三个规范,他们有的人说不算什么规范,顶多可以理解为十三 ...

  5. pytorch实现squeezenet

    squeezenet是16年发布的一款轻量级网络模型,模型很小,只有4.8M,可用于移动设备,嵌入式设备. 关于squeezenet的原理可自行阅读论文或查找博客,这里主要解读下pytorch对squ ...

  6. LUNA16数据集(一)简介

    LUNA16,全称Lung Nodule Analysis 16,是16年推出的一个肺部结节检测数据集,旨在作为评估各种CAD(computer aid detection计算机辅助检测系统)的ban ...

  7. Maven with Scala

    下面是一个在Maven使用Scala的pom.xml <?xml version="1.0" encoding="UTF-8" standalone=&q ...

  8. 使用Mybatis-plus发生org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):

    容我慢慢说来,之前是使用springboot+mybatis.我一直采用xml配置文件写sql. 后来采用了mybatis-plus之后,在本地上面测试没有一点问题.一放到服务器就发生这种情况 在本地 ...

  9. liunx postfix与sendmail 开启与关闭

    1:检查sendmail服务的状态 service sendmail status 2:开启sendmail服务 service sendmail start 3:关闭sendmail服务 servi ...

  10. I2C(smbus pmbus)和SPI分析

    2C和SPI作为两种非常常用的低速外部总线 I2C I2C是以前的飞利浦半导体制定的标准,也就是如今的NXP. I2C总线由一条数据线(SDA)和一条时钟线(SCL)组成.设备分主从,主设备提供时钟, ...