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 ...
随机推荐
- Codeforces Round #586 (Div. 1 + Div. 2)D(二分图构建,思维,结论需数论证明)
#include<bits/stdc++.h>using namespace std;long long a[200007];vector<int>v[77];int main ...
- 【PAT甲级】1015 Reversible Primes (20 分)
题意: 每次输入两个正整数N,D直到N是负数停止输入(N<1e5,1<D<=10),如果N是一个素数并且将N转化为D进制后逆转再转化为十进制后依然是个素数的话输出Yes,否则输出No ...
- eslint检测规则中,括弧和函数名之间去掉空格的配置
在.eslintrc.js中配置: // add your custom rules here rules: { // no space before function name "spac ...
- SRSniffer抓包工具的使用
1.打开SRSniffer软件 2.按照1-->2-->3依次点击 3.点击左侧的启动监听按钮 4.打开要记录api的软件,查看效果
- c++实现线性表中的顺序表(数据结构课程作业)
一.题目简介 实现顺序表的创建.初始化.赋值.插入.删除.按数据查找元素位置.按元素位置查找数据.清空.删除 的操作,以上操作用可用菜单选项完成 二.源程序代码 #include<iostrea ...
- IAR STM32F10x_StdPeriph_Driver 3.4转3.6.1库
1.Fatal Error[Pe1696]: cannot open source file core_cmInstr.h STM32F10x_StdPeriph_Driver 3.4库移植换成3.6 ...
- Http服务和JSP
需要先安装tomocat8.0,并且使用的IDEA 一个web项目 新建项目 写代码 // 新建一个class @WebServlet("/test") public class ...
- 「USACO08JAN」电话线Telephone Lines
传送门 Luogu 解题思路 考虑二分,每次把大于二分值的边的权设为1,小于等于的设为0,如果最短路<=k则可行,记得判无解 细节注意事项 咕咕咕 参考代码 #include <algor ...
- Java泛型与数组深入研究
Java中的泛型与数组平时开发用的很多,除了偶尔遇到"NullPointerException"和"IndexOutOfBoundsException"一般也不 ...
- 使用 MYSQLBINLOG 来恢复数据
使用 MYSQLBINLOG 来恢复数据 2009-04-05 12:47:05 标签:mysql mysqlbinlog 恢复 数据库 数据 原创作品,允许转载,转载时请务必以超链接形式标明文章 原 ...