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 ...
随机推荐
- Linux centosVMware 自动化运维Ansible介绍、Ansible安装、远程执行命令、拷贝文件或者目录、远程执行脚本、管理任务计划、安装rpm包/管理服务、 playbook的使用、 playbook中的循环、 playbook中的条件判断、 playbook中的handlers、playbook实战-nginx安装、管理配置文件
一.Ansible介绍 不需要安装客户端,通过sshd去通信 基于模块工作,模块可以由任何语言开发 不仅支持命令行使用模块,也支持编写yaml格式的playbook,易于编写和阅读 安装十分简单,ce ...
- 莫烦 - Pytorch学习笔记 [ 一 ]
1. Numpy VS Torch #相互转换 np_data = torch_data.numpy() torch_data = torch.from_numpy(np_data) #abs dat ...
- Kafka 启动报错java.io.IOException: Can't resolve address.
阿里云上 部署Kafka 启动报错java.io.IOException: Can't resolve address. 本地调试的,报错 需要在本地添加阿里云主机的 host 映射 linux ...
- 问题解决 : org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
问题分析: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): ,即在mybatis中da ...
- leetcode209 Minimum Size Subarray Sum
""" Given an array of n positive integers and a positive integer s, find the minimal ...
- PaperReading20200226
CanChen ggchen@mail.ustc.edu.cn To share or not share Motivation: With the publiaction of NAS101, ...
- Metric类型
Metric类型 在上一小节中我们带领读者了解了Prometheus的底层数据模型,在Prometheus的存储实现上所有的监控样本都是以time-series的形式保存在Prometheus内存的T ...
- DeepCTR-Torch
仅作学习使用 在ubuntu安装成功了,可以运行example.jump2 但是在mac没有成功,报错 ImportError: No module named torch
- Spark教程——(2)编写spark-submit测试Demo
创建Maven项目: 填写Maven的pom文件如下: <?xml version="1.0" encoding="UTF-8"?> <pro ...
- Linux CentOS7 VMware 文件和目录权限chmod、更改所有者和所属组chown、umask、隐藏权限lsattr/chattr
一.文件和目录权限chmod u User,即文件或目录的拥有者:g Group,即文件或目录的所属群组:o Other,除了文件或目录拥有者或所属群组之外,其他用户皆属于这个范围:a All,即全部 ...