何为单调队列?

单调队列是一个队列(废话)

而且必须同时满足下标单调和值单调两个单调特性。

跟优先队列不同,优先队列直接使用堆(heap)来实现,如何删去特定下标元素?不明。

本人喜欢用单调队列存下标,这样比存值不知道高到哪里去了。

新来一个元素,进队。之后特判长度有没有超过。超过则把最前面的元素出队。

之后,如果不满足性质,就把前面的元素顶掉,直到满足性质为止。

然后才可以把队首元素拿来用。

有几个很坑的地方,具体看代码注释。

(为什么top是队尾而tail是队首?laughcry)

例题:洛谷P1886,高级模板题。还有一道剧毒的P2216。(排版很奇怪,都怪反人类的博客园☺)

AC代码:

 #include <cstdio>
const int N = ; int pl[N], l_t, l_h = , ansl[N];
int ps[N], s_t, s_h = , anss[N];
int a[N]; int main() {
int n, k;
scanf("%d%d", &n, &k);
for(int i = ; i <= n; i++) {
scanf("%d", &a[i]);
}
for(int i = ; i <= n; i++) {
pl[++l_t] = i;
ps[++s_t] = i;
if(pl[l_h] + k <= i) {
l_h++;
}
if(ps[s_h] + k <= i) {
s_h++;
}
while(l_t > l_h && a[pl[l_t - ]] <= a[i]) {
l_t--;
}
while(s_t > s_h && a[ps[s_t - ]] >= a[i]) {
s_t--;
}
pl[l_t] = i;
ps[s_t] = i;
ansl[i] = pl[l_h];
anss[i] = ps[s_h];
}
for(int i = k; i <= n; i++) {
printf("%d ", a[anss[i]]);
}
printf("\n");
for(int i = k; i <= n; i++) {
printf("%d ", a[ansl[i]]);
}
return ;
}

最新写的P1886

 #include <cstdio>
#include <algorithm>
using namespace std;
const int N=;
struct ah{int large,small;}f[N][N];
int c[N][N];
int p1[N],p2[N],top1,tail1=,top2,tail2=;///存下标
int a,b,n;///p1求min,p2求max
long long int ans=,s; int main()
{
scanf ("%d%d%d",&a,&b,&n);
for(int i=;i<=a;i++)
{
top1=top2=;
tail1=tail2=;
for(int j=;j<=b;j++)
{
scanf ("%d",&c[i][j]);
p1[++top1]=p2[++top2]=j;
while(c[i][p1[top1]]<=c[i][p1[top1-]] && top1>tail1)
{///单调队列维护
p1[top1-]=p1[top1];
top1--;
}
while(c[i][p2[top2]]>=c[i][p2[top2-]] && top2>tail2)
{
p2[top2-]=p2[top2];
top2--;
}
if(p1[top1]-p1[tail1]>=n) tail1++;///区间长度n
if(p2[top2]-p2[tail2]>=n) tail2++;
if(j>=n)
{///产生最大最小值
f[i][j-n+].large=c[i][p2[tail2]];
f[i][j-n+].small=c[i][p1[tail1]];
}
}
}
///读入完毕,处理①完毕
/*
for(int i=1;i<=a;i++)///调试
{
for(int j=1;j<=b-n+1;j++)
{
printf("%d-%d ",f[i][j].large,f[i][j].small);
}
printf("\n");
}*/ for(int j=;j<=b-n+;j++)
{
top1=top2=;
tail1=tail2=;
for(int i=;i<=a;i++)///p1 small p2 large
{
p1[++top1]=p2[++top2]=i;
while(f[p1[top1]][j].small<=f[p1[top1-]][j].small && top1>tail1)
{
p1[top1-]=p1[top1];
top1--;
}
while(f[p2[top2]][j].large>=f[p2[top2-]][j].large && top2>tail2)
{
p2[top2-]=p2[top2];
top2--;
}
if(p1[top1]-p1[tail1]>=n) tail1++;
if(p2[top2]-p2[tail2]>=n) tail2++;
if(i>=n)
{///产生最值
s=1ll*(f[p2[tail2]][j].large-f[p1[tail1]][j].small);
//printf("%d ",s);
ans=min(ans,s);
} }
//printf("\n");
}
printf("%lld",ans);
return ;
}

P2216

博客园排版有剧毒。。。

P1886 P2216 单调队列模板的更多相关文章

  1. luoguP1886 滑动窗口(单调队列模板题)

    题目链接:https://www.luogu.org/problem/P1886#submit 题意:给定n个数,求大小为k的滑动窗口中最小值和最大值. 思路:单调队列模板题. AC代码: #incl ...

  2. Sliding Window POJ - 2823 单调队列模板题

    Sliding Window POJ - 2823 单调队列模板题 题意 给出一个数列 并且给出一个数m 问每个连续的m中的最小\最大值是多少,并输出 思路 使用单调队列来写,拿最小值来举例 要求区间 ...

  3. 洛谷P1886--滑动窗口(单调队列模板)

    https://www.luogu.org/problemnew/show/P1886 单调队列的操作上比普通队列多了可以从尾端出队 单调队列保持队内元素单调递增/递减,以保证队首元素为最小/最大元素 ...

  4. hdu3415 单调队列模板题

    比较裸的单调队列 先求前缀和,枚举所有结束位置1~n+k即可 #include<iostream> #include<cstdio> #include<cstring&g ...

  5. POJ 2823 滑动窗口 单调队列模板

    我们从最简单的问题开始: 给定一个长度为N的整数数列a(i),i=0,1,...,N-1和窗长度k. 要求: f(i) = max{a(i-k+1),a(i-k+2),..., a(i)},i = 0 ...

  6. poj 2823单调队列模板题

    #include<stdio.h>//每次要吧生命值长的加入,吧生命用光的舍弃 #define N  1100000 int getmin[N],getmax[N],num[N],n,k, ...

  7. 题解【洛谷P1886】滑动窗口 /【模板】单调队列

    题面 单调队列模板题. 单调队列可以从队首和队尾出队. 队列中的元素大小具有一定的顺序. 具体可参考这一篇题解 #include <bits/stdc++.h> #define itn i ...

  8. POJ 2823 Sliding Window​ (模板题)【单调队列】

    <题目链接> <转载于>>> > 题目大意: 给你一段序列和一个长为k的窗口,这个窗口从最左边逐渐向右滑,直到滑到最右边,问你,该窗口在滑动的过程中,最大值和 ...

  9. 【模板】deque实现单调队列

    双端队列deque容器: 关于deque最常用的有这几个函数: 都是成员函数 双端队列模板题:[洛谷]P2952 [USACO09OPEN]牛线Cow Line #include<iostrea ...

随机推荐

  1. spring mvc常用注解总结

    1.@RequestMapping@RequestMappingRequestMapping是一个用来处理请求地址映射的注解(将请求映射到对应的控制器方法中),可用于类或方法上.用于类上,表示类中的所 ...

  2. VSC软件快捷键

    Shift + Alt + F  格式化 Ctrl+Shift+P, F1显示命令面板 Ctrl+P快速打开,进入File… Ctrl + Shift + N新窗口/实例 Ctrl + Shift + ...

  3. java学习之—并归排序

    /** * 并归排序 * Create by Administrator * 2018/6/26 0026 * 下午 5:13 **/ public class DArray { private lo ...

  4. echo "" > 和 echo "" >> 的区别

    在写shell脚本中,如果判断一个文件已经存在,但希望重写这个文件,一般用如下方式 echo "" > file.txt 这个表示清空文件的内容,如果使用 echo “” & ...

  5. 莫烦theano学习自修第二天【激励函数】

    1. 代码如下: #!/usr/bin/env python #! _*_ coding:UTF-8 _*_ import numpy as np import theano.tensor as T ...

  6. supervisor /var/run/supervisor/supervisor.sock not found 或者/tmp/supervisor.sock not found

    刚按装完supervisor,这时候用supervisorctr -c supervisor.conf 会报错: /var/run/supervisor/supervisor.sock not fou ...

  7. LODOP直接用base64码输出图片

    Lodop中的ADD_PRINT_IMAGE,也可以直接输出base64码图片,不用加img标签,如果加了img标签,会被当做超文本对待,受浏览器引擎解析的影响. 什么时候使用base64码直接输出比 ...

  8. js数组中两个有相同删除一个

    for (var i = 0; i < project.Before.length; i++) {                    var j = 0;                   ...

  9. 学习 Spring (十) 注解之 @Bean, @ImportResource, @Value

    Spring入门篇 学习笔记 @Bean @Bean 标识一个用于配置和初始化一个由 Spring IoC 容器管理的新对象的方法,类似于 XML 配置文件的 可以在 Spring 的 @Config ...

  10. FTC诉高通垄断案苹果从中受益

    据外媒报道,美国当地时间周二,美国联邦贸易委员会(FTC)诉芯片制造商高通公司(Qualcomm)垄断案进入了终结辩论阶段.这意味着,这起审判也进入最后阶段,它可能颠覆高通在智能手机时代取得成功的至关 ...