【POJ 2823】Sliding Window(单调队列/堆)
BUPT2017 wintertraining(16) #5 D
POJ - 2823
题意
给定n,k,求滑窗[i,i+k-1]在(1<=i<=n)的最大值最小值。
题解
单调队列或堆。
入队的条件是当前的进入了滑窗范围。
出队的条件是当前不在滑窗范围。
代码
我用堆写的,但是堆写错了个小地方,查了很久才发现。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define pii pair<int,int>
#define mp(i,j) make_pair(i,j)
#define N 1000006
using namespace std;
int n,k;
int a[N];
pii q[N];
int back;
void push(pii a,int d){
q[++back]=a;
for(int i=back;i>1&&(d?q[i]>q[i>>1]:q[i]<q[i>>1]);i>>=1)
swap(q[i],q[i>>1]);
}
void pop(int d){
swap(q[1],q[back--]);
for(int i=1;i<=(back>>1);){
if(d?q[i]>=max(q[i<<1],q[i<<1|1]):q[i]<=min(q[i<<1],q[i<<1|1]))return;//qaq
if(((i<<1|1)>back)||(d?q[i<<1]>q[i<<1|1]:q[i<<1]<q[i<<1|1])){
swap(q[i<<1],q[i]);
i<<=1;
}else{
swap(q[i<<1|1],q[i]);
i=(i<<1|1);
}
}
}
int main() {
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(i<=k)push(mp(a[i],i),0);
}
for(int i=k;i<=n;i++){
printf("%d ",q[1].first);
while(back&&q[1].second<=i-k+1)pop(0);
push(mp(a[i+1],i+1),0);
}
puts("");
back=0;
for(int i=1;i<=k;i++)push(mp(a[i],i),1);
for(int i=k;i<=n;i++){
printf("%d ",q[1].first);
while(back&&q[1].second<=i-k+1)pop(1);
push(mp(a[i+1],i+1),1);
}
return 0;
}
单调队列,写起来简单多了,而且也不会和手写堆一样容易出错。
#include <cstdio>
#define N 1000006
using namespace std;
int n,k;
int a[N],b[N],q[N],head,tail;
int main() {
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++){
while(head<tail&&a[i]<q[tail-1])tail--;
b[tail]=i;
q[tail++]=a[i];
while(head<tail&&b[head]<i-k+1)head++;
if(i>=k)printf("%d ",q[head]);
}
puts("");
tail=head=0;
for(int i=1;i<=n;i++){
while(head<tail&&a[i]>q[tail-1])tail--;
b[tail]=i;
q[tail++]=a[i];
while(head<tail&&b[head]<i-k+1)head++;
if(i>=k)printf("%d ",q[head]);
}
return 0;
}
【POJ 2823】Sliding Window(单调队列/堆)的更多相关文章
- POJ 2823 Sliding Window + 单调队列
一.概念介绍 1. 双端队列 双端队列是一种线性表,是一种特殊的队列,遵守先进先出的原则.双端队列支持以下4种操作: (1) 从队首删除 (2) 从队尾删除 (3) 从队尾插入 (4) ...
- poj 2823 Sliding Window (单调队列入门)
/***************************************************************** 题目: Sliding Window(poj 2823) 链接: ...
- POJ 2823 Sliding Window (单调队列)
单调队列 加了读入挂比不加更慢.... 而且这份代码要交c++ 有大神G++跑了700ms..... orzorzorz #include<iostream> #include<cs ...
- poj 2823 Sliding Windows (单调队列+输入输出挂)
Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 73426 Accepted: 20849 ...
- POJ 2823 Sliding Window 题解
POJ 2823 Sliding Window 题解 Description An array of size n ≤ 106 is given to you. There is a sliding ...
- 洛谷P1886 滑动窗口(POJ.2823 Sliding Window)(区间最值)
To 洛谷.1886 滑动窗口 To POJ.2823 Sliding Window 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每 ...
- POJ 2823 Sliding Window(单调队列入门题)
Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 67218 Accepted: 190 ...
- POJ 2823 Sliding Window 【单调队列】
题目链接:http://poj.org/problem?id=2823 题目大意:给出一组数,一个固定大小的窗体在这个数组上滑动,要求出每次滑动该窗体内的最大值和最小值. 这就是典型的单调队列,单调队 ...
- 【单调队列】poj 2823 Sliding Window
http://poj.org/problem?id=2823 [题意] 给定一个长度为n的序列,求长度为k的滑窗内的最大值和最小值 [思路] 裸的单调队列 注意用C++提交,不然会T,orz我用G++ ...
- 题解报告:poj 2823 Sliding Window(单调队列)
Description An array of size n ≤ 106 is given to you. There is a sliding window of size k which is m ...
随机推荐
- Luogu2046 NOI2010 海拔 平面图、最小割、最短路
传送门 首先一个不知道怎么证的结论:任意点的\(H\)只会是\(0\)或\(1\) 那么可以发现原题的本质就是一个最小割,左上角为\(S\),右下角为\(T\),被割开的两个部分就是\(H=0\)与\ ...
- HTML 图片轮播制作工具
下载地址:http://wowslider.com/download/wowslider-win-setup.zip?utm_source=free_downl_win&utm_medium= ...
- 关于ajax的controller层返回jsp页面多个list
@RequestMapping(value ="findFansChangeRate") @ResponseBody public AjaxJson findFansChangeR ...
- Android 真机调试
/************************摘抄*****************************/ 刚好遇到这个问题,在网上百度了一下,看到有人分享了引起该问题的几个原因: 1.手机设 ...
- 老牌阅读器nook2刷机整理
kindle肯定是现在大多数人了解电纸书这个产品的开端,也给我留下了一段美好的回忆,不折腾,不死机,官方书城让人省心不少,不过作为半个折腾爱好者,kindle显然不符合我的理念,遂慢慢入了安卓电纸书的 ...
- Python进阶量化交易场外篇5——标记A股市场涨跌周期
新年伊始,很荣幸笔者的<教你用 Python 进阶量化交易>专栏在慕课专栏板块上线了,欢迎大家订阅!为了能够提供给大家更轻松的学习过程,笔者在专栏内容之外会陆续推出一些手记来辅助同学们学习 ...
- 11.13 Daily Scrum
今天在实现餐厅列表时,原来使用的百度地图poi搜索接口无法返回餐厅的具体信息. 经过一番周折,找到了一个返回餐厅url的接口.我们调整了一下实现,在点击餐厅列表的某一项点击直接跳到和该餐厅信息有关的网 ...
- Linux内核分析第四周学习总结
朱国庆+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 扒开系统调用的三层皮 ...
- 第三个Sprint ------第七天
APP.java代码 package com.app.senior_calculator; import java.io.Serializable; import java.util.ArrayLis ...
- Fastdfs文件服务器搭建
安装FastDFS之前,先安装libevent工具包.然后要安装libfastcommon和FastDFS,还要依赖nginx来显示图片. 1安装libevent yum -y install lib ...