【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 ...
随机推荐
- SQL Server中比较末尾带有空格的字符串遇到的坑 (转载)
最近发现SQLServer中比较字符串的时候 如果字符串末尾是空格 那么SQLServer会无视那些空格直接进行比较 这和程序中平时的字符串判断逻辑不统一 );set @a=N'happycat198 ...
- DataWorks使用小结(二)——功能面板使用指南
一.数据开发 1.任务开发 新建表 野路子可以直接新建一个任务,粘贴DDL,手动运行任务即可完成建表 正常应当是在“数据管理”->数据表管理中建表: 支持可视化建表和DDL建表(配合之前的宏,建 ...
- 如何实现.net程序的进程注入
原文:如何实现.net程序的进程注入 如何实现.net程序的进程注入 周银辉 进程注入比较常见,比如用IDE调试程序以及一些Sp ...
- C# 简单的 Job 作业~
改变之前的前言,这次咱这样写: 一个习惯只需十天的坚持就可以养成,坏习惯也不例外!吸烟喝酒的我能否做到十天不吸烟喝酒呢? 呵呵 养成习惯关键还要看决心和意志力 恩,努力控烟吧! 废话说完了,就进入咱们 ...
- Android开发——ListView使用技巧总结(一)
)还有一点就是要控制异步任务的执行频率,因为当用户频繁的上下滑动,会瞬间产生上百个异步任务,会带来无意义的大量的UI更新操作,因此可以考虑在列表滑动时停止进行异步任务,直到列表停下来. //判断列表的 ...
- HNOI2019 多边形 polygon
HNOI2019 多边形 polygon https://www.luogu.org/problemnew/show/P5288 这题镪啊... 首先堆结论: 显然终止状态一定是所有边都连向n了 根据 ...
- Fedora 19关闭防火墙
关闭防火墙systemctl stop firewalld.service 关闭开机启动防火墙systemctl disable firewalld.service
- nginx try_files 详解
server { listen ; server_name localhost; index index.html index.htm index.php; root /data/wwwroot; l ...
- Linux内核分析作业第四周
系统调用的三个层次 一.用户态.内核态和中断 用户通过库函数与系统调用联系起来. 1.内核态 在高的执行级别下,代码可以执行特权指令,访问任意的物理地址,这时的CPU就对应内核态 2.用户态: 在低级 ...
- ☆C++学习心得
C++是我进大学的学的第一种编程语言,在高中的时候有电脑课,有教过部分的VB语言,所以其实对编程也并不是非常的陌生,刚开是上课也觉得感觉不难,都懂,没多少课后,恍了个神..居然听不懂了!老师经常让我们 ...