P1886 P2216 单调队列模板
何为单调队列?
单调队列是一个队列(废话)
而且必须同时满足下标单调和值单调两个单调特性。
跟优先队列不同,优先队列直接使用堆(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 单调队列模板的更多相关文章
- luoguP1886 滑动窗口(单调队列模板题)
题目链接:https://www.luogu.org/problem/P1886#submit 题意:给定n个数,求大小为k的滑动窗口中最小值和最大值. 思路:单调队列模板题. AC代码: #incl ...
- Sliding Window POJ - 2823 单调队列模板题
Sliding Window POJ - 2823 单调队列模板题 题意 给出一个数列 并且给出一个数m 问每个连续的m中的最小\最大值是多少,并输出 思路 使用单调队列来写,拿最小值来举例 要求区间 ...
- 洛谷P1886--滑动窗口(单调队列模板)
https://www.luogu.org/problemnew/show/P1886 单调队列的操作上比普通队列多了可以从尾端出队 单调队列保持队内元素单调递增/递减,以保证队首元素为最小/最大元素 ...
- hdu3415 单调队列模板题
比较裸的单调队列 先求前缀和,枚举所有结束位置1~n+k即可 #include<iostream> #include<cstdio> #include<cstring&g ...
- 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 ...
- poj 2823单调队列模板题
#include<stdio.h>//每次要吧生命值长的加入,吧生命用光的舍弃 #define N 1100000 int getmin[N],getmax[N],num[N],n,k, ...
- 题解【洛谷P1886】滑动窗口 /【模板】单调队列
题面 单调队列模板题. 单调队列可以从队首和队尾出队. 队列中的元素大小具有一定的顺序. 具体可参考这一篇题解 #include <bits/stdc++.h> #define itn i ...
- POJ 2823 Sliding Window (模板题)【单调队列】
<题目链接> <转载于>>> > 题目大意: 给你一段序列和一个长为k的窗口,这个窗口从最左边逐渐向右滑,直到滑到最右边,问你,该窗口在滑动的过程中,最大值和 ...
- 【模板】deque实现单调队列
双端队列deque容器: 关于deque最常用的有这几个函数: 都是成员函数 双端队列模板题:[洛谷]P2952 [USACO09OPEN]牛线Cow Line #include<iostrea ...
随机推荐
- embed标签的flash层级太高问题
因为客户要求,项目得兼容IE的兼容模式 页面到了flash都会遮挡底部悬浮的导航. 改变浮动窗口和embed的层级还是不可以.应该不是层级的关系. 最后百度解决方案:在embed标签内添加了wmode ...
- Delphi处理数据网格DBGrid的编辑框 获取还没有提交到数据集的字段文本
//fromhttp://kingron.myetang.com/zsfunc12.htm (*//标题:处理数据网格的编辑框说明:示例添加焦点颜色;获取还没有提交到数据集的字段文本设计:Zswang ...
- 后台web端的react
在api.js里,存放着各种功能引用的方法,比如这个fakeRegister,里面传参数params,返回要要调回的地址,${HOST1}/user/register requset会返回codeme ...
- windows git支持arc命令
本文整理了在Windows系统上安装代码审查工具Arcanist的过程.目的是配合Phabricator进行代码review.配置成功后可使用arc diff命令来发起code review. 1.安 ...
- Paint it really, really dark gray CodeForces - 717E
Paint it really, really dark gray CodeForces - 717E 题意 有一棵树 每个结点是粉色或黑色 每经过一个结点 就改变他的颜色 从1开始遍历 打印出一条路 ...
- poj-1459(网络流-最大流)
题意:给你n个点的电网系统,有一些点是电站,能提供p的电能,有些点是用户,能消耗c的电能,有些是过渡站,不消耗不产生(等于没用),然后m条电线(x,y,w),代表x可以向y运输w的电能,问你这个电网系 ...
- poj2100(尺取法)
题意:选取一系列数,使得这些数的平方和等于n: 解题思路:尺取法扫一遍: #include<iostream> #include<algorithm> using namesp ...
- 【建模应用】PCA主成分分析原理详解
原文载于此:http://blog.csdn.net/zhongkelee/article/details/44064401 一.PCA简介 1. 相关背景 上完陈恩红老师的<机器学习与知识发现 ...
- 吉哥系列故事――恨7不成妻 HDU - 4507 数位dp
思路 和普通的DP不一样的是 这里求的是满足条件的数的平方的和 而数位DP只跟数每位是什么密切相关 所以要开一个结构 (多加一个 数的和sum 和平方和qsum)存一下各个状态的和的情况 dp[p ...
- IOS端 margin-top 和 margin-bottom 使用负数时的区别
有以下html代码 <div style="width: 30%;" class="shang"> 1 </div> <div s ...