POJ 2823:Sliding Window 单调队列
| Time Limit: 12000MS | Memory Limit: 65536K | |
| Total Submissions: 48930 | Accepted: 14130 | |
| Case Time Limit: 5000MS | ||
Description
moves rightwards by one position. Following is an example:
The array is [1 3 -1 -3 5 3 6 7], and k is 3.
| Window position | Minimum value | Maximum value |
|---|---|---|
| [1 3 -1] -3 5 3 6 7 | -1 | 3 |
| 1 [3 -1 -3] 5 3 6 7 | -3 | 3 |
| 1 3 [-1 -3 5] 3 6 7 | -3 | 5 |
| 1 3 -1 [-3 5 3] 6 7 | -3 | 5 |
| 1 3 -1 -3 [5 3 6] 7 | 3 | 6 |
| 1 3 -1 -3 5 [3 6 7] | 3 | 7 |
Your task is to determine the maximum and minimum values in the sliding window at each position.
Input
Output
Sample Input
8 3
1 3 -1 -3 5 3 6 7
Sample Output
-1 -3 -3 -3 3 3
3 3 5 5 6 7
题意很好理解,就是对一个长度为n的数组,有一个大小为k的窗口不断向右移动,找出这个窗口中的最小值和最大值。
单调队列,如果是求最小值的话:满足两个条件,一个是队列中的元素从左至右 是从小到大的关系,保证从队头中提取出来的元素是最小值。求最大值则相反。
然后是队列的位置关系,要保证每一时刻队头的位置是最先淘汰的,其实这个不用去刻意保证,只要是从左扫到右,最先进来的元素肯定是最新鲜的元素,即后面位置的元素,只需满足head<=tail,就可以满足当p[head]在窗口外面时,只需head++的条件了。
代码:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#pragma warning(disable:4996)
using namespace std; #define maxn 1000005
int A[maxn];//存储数据
int Q[maxn];//队列
int P[maxn];//存储A[i]中的下标i
int Min[maxn];//输出最小
int Max[maxn];//输出最大
int n,k,num; void get_min()
{
int i;
int head=1,tail=0;
num=0;
for(i=0;i<k-1;i++)
{
while(head<=tail && Q[tail]>=A[i])
{
tail--;
}
Q[++tail]=A[i];
P[tail]=i;
//while(head<i-k+1&&head<=tail)
// head++;
}
for(;i<n;i++)
{
while(head<=tail &&Q[tail]>=A[i])
{
tail--;
}
Q[++tail]=A[i];
P[tail]=i;
while(P[head]<i-k+1&&head<=tail)
head++;
Min[num++]=Q[head];
}
} void get_max()
{
int i;
int head=1,tail=0;
num=0;
for(i=0;i<k-1;i++)
{
while(head<=tail && Q[tail]<= A[i])
{
tail--;
}
Q[++tail]=A[i];
P[tail]=i;
//while(head<i-k+1&&head<=tail)
// head++;
}
for(;i<n;i++)
{
while(head<=tail &&Q[tail] <= A[i])
{
tail--;
}
Q[++tail]=A[i];
P[tail]=i;
while(P[head]<i-k+1&&head<=tail)
head++;
Max[num++]=Q[head];
}
} int main()
{
//freopen("i.txt","r",stdin);
//freopen("o.txt","w",stdout); int i;
scanf("%d%d",&n,&k); for(i=0;i<n;i++)
{
scanf("%d",A+i);
}
get_min();
for(i=0;i<num;i++)
{
if(i==0)
{
printf("%d",Min[i]);
}
else
{
printf(" %d",Min[i]);
}
}
printf("\n"); get_max();
for(i=0;i<num;i++)
{
if(i==0)
{
printf("%d",Max[i]);
}
else
{
printf(" %d",Max[i]);
}
}
printf("\n");
//system("pause");
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 ...
随机推荐
- Web - 实用组件
1, vue-awesome-swiper 基于 Swiper4.适用于 Vue 的轮播组件,支持服务端渲染和单页应用. 2, http://www.spritecow.com/ 雪碧图背 ...
- GET和POST面试知识点
导读:大部分APP都依赖于网络通信,对于开发者来说,基于网络通信的开发无疑是必须掌握的.HTTP通信作为目前计算机主要的通信协议,是企业面试当中必问的.对于HTTP通信的概念,本文不作说明,我将在后续 ...
- 「luogu2617」Dynamic Rankings
「luogu2617」Dynamic Rankings 传送门 树套树直接上树状数组套主席树,常数很大就是了. 树套树参考代码: /*-------------------------------- ...
- 强制设置双缓冲DoubleBuffered 解决tableLayoutPanel 闪烁
tableLayoutPanel.GetType().GetProperty("DoubleBuffered", System.Reflection.BindingFlags.In ...
- ASP.NET MVC Web项目中使用Log4Net记录日志,并按照日志类型分文件存储
1.创建MvcLog4Net项目 2.创建 空的MVC项目 3.项目创建完成的效果 4.选择项目,点击鼠标右键,在弹出菜单中选择“管理解决方案的 NuGet 程序包” 5. 在NuGet浏览界面: 点 ...
- iOS收起键盘
在UIViewController中收起键盘,有四种代码方式: 1.让相应的控件放弃第一响应者 /** 放弃第一响应者 */ [self.nameTextField resignFirstRespon ...
- C# Show()与ShowDialog()的区别-----转载
A.WinForm中窗体显示 显示窗体可以有以下2种方法: Form.ShowDialog方法 (窗体显示为模式窗体) Form.Show方法 (窗体显示为无模式窗体) 两者具体区别如下: 1 ...
- day6 作业 购物车
- Python作业篇 day04
###一.写代码,有如下列表,按照要求实现每一个功能 li=['alex','bibi','cc0','didi'] #1.计算列表的长度 #2.列表中追加元素'seven',并输出添加后的列表 #3 ...
- PaperReading20200219
CanChen ggchen@mail.ustc.edu.cn This is my first day sharing my reading paper and I will try to para ...