WINDOW(单调队列的应用)
给你一个长度为 N 的数组,一个长为 K 的滑动的窗体从最左移至最右端,
你只能见到窗口的K个数,每次窗体向右移动一位,如下表:
你的任务是找出窗口在各位置时的 max value,min value.
INPUT:
第 1 行 n,k,
20%:n<=500;
50%: n<=100000;
100%: n<=1000000;
第 2 行为长度为 n 的数组
8 3
1 3 -1 -3 5 3 6 7
OUTPUT:
2 行,
第 1 行每个位置的 min value,
第 2 行每个位置的 max value
-1 -3 -3 -3 3 3
3 3 5 5 6 7
题解:
如果每次都要sort的话,小数据可以O(n*k),但是数据大的话一定会超时。
那么该如何搞呢? 单调队列。O(n)效率很高!!
单调队列,一个元素单调的队列,可以保证队头是最小(最大)的;
可以通过队首删除,队尾插入来维护最优值。
这道题,就是通过单调队列来维护一个最大值和最小值。
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<cstdlib>
#include<iomanip>
#include<ctime>
using namespace std;
const int maxn=;
int n,k;
int a[maxn],q[maxn];
int tail=,head=; int main()
{
cin>>n>>k;
for(int i=;i<=n;i++)
cin>>a[i];
q[tail]=;
for(int i=;i<k;i++)
{
while(a[i]<a[q[tail]]&&tail>=head)
{
tail--;
}
q[++tail]=i;
}
for(int i=k;i<=n;i++)
{
if(i-q[head]==k) head++;
while(a[i]<a[q[tail]]&&tail>=head)
{
tail--;
}
q[++tail]=i;
cout<<a[q[head]]<<" ";
}
cout<<endl;
memset(q,,sizeof(q));
head=,tail=;
q[tail]=;
for(int i=;i<k;i++)
{
while(a[i]>a[q[tail]]&&tail>=head)
{
tail--;
}
q[++tail]=i;
}
for(int i=k;i<=n;i++)
{
if(i-q[head]==k) head++;
while(a[i]>a[q[tail]]&&tail>=head)
{
tail--;
}
q[++tail]=i;
cout<<a[q[head]]<<" ";
}
cout<<endl;
return ;
}
WINDOW(单调队列的应用)的更多相关文章
- POJ 2823 Sliding Window + 单调队列
一.概念介绍 1. 双端队列 双端队列是一种线性表,是一种特殊的队列,遵守先进先出的原则.双端队列支持以下4种操作: (1) 从队首删除 (2) 从队尾删除 (3) 从队尾插入 (4) ...
- poj 2823 Sliding Window (单调队列入门)
/***************************************************************** 题目: Sliding Window(poj 2823) 链接: ...
- POJ2823 Sliding Window(单调队列)
单调队列,我用deque维护.这道题不难写,我第二次写单调队列,1次AC. -------------------------------------------------------------- ...
- POJ 2823:Sliding Window 单调队列
Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 48930 Accepted: 14130 ...
- POJ 2823 Sliding Window (单调队列)
单调队列 加了读入挂比不加更慢.... 而且这份代码要交c++ 有大神G++跑了700ms..... orzorzorz #include<iostream> #include<cs ...
- POJ 2823 UESTCoj 1221 Sliding Window 单调队列 经典入门题
题意:给出一个序列,求出每连续k个数字中最大的数和最小的数. 这是道单调队列裸题,直接写就行了. 本来用deque写出来后,发现在poj上硬是超时了,在discuss上看很多人也在抱怨超时的问题,据说 ...
- poj2823Sliding Window——单调队列
题目:http://poj.org/problem?id=2823 单调队列模板. 代码如下: #include<iostream> #include<cstdio> usin ...
- 【t019】window(单调队列)
Time Limit: 2 second Memory Limit: 256 MB [问题描述] 给你一个长度为N 的数组,一个长为K的滑动的窗体从最左移至最右端,你只能见到窗口的K个数,每次窗体向右 ...
- POJ2823 Sliding Window (单调队列)
POJ2823 Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 38342 Accepte ...
- POJ 2823 Sliding Window(单调队列入门题)
Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 67218 Accepted: 190 ...
随机推荐
- PowerMockito 同时mock多个对象
有时候,需要测试的方法内有collections结构,就需要同时mock多个对象 被测方法: public class EmployeeService { public List<Integer ...
- RHEL6.4编译安装企业级LAMMP平台
一.LAMMP简介 二.使用软件及服务器架构说明 三.配置及安装过程 1.安装arp与httpd 2.安装mysql 3.安装php(php-fpm) 4.安装Xcache ...
- http状态消息
1-5状态码了解 1XX 表示信息(消息) 2XX 表示成功 3XX 表示重定向 4XX 表示请求错误 *** 5XX 表示服务端错误 常见状态码 200 请求成功 一切正常 301 重定向,修改后的 ...
- JSP 新闻发布会
---恢复内容开始--- 首先 新闻发布会结合了JSP里的Servlet和request对象,response对象还有使用session对象和cookie对象跟踪用户信息等等..... 列表 登陆 这 ...
- jsp中的正则表达式
sp中${}----是EL表达式的常规表示方式目的是为了获取{}中指定的对象(参数.对象等)的值如:${user.name}<====>User user = (User)request( ...
- php 画图片2
<?php // 使用php操作gd库做图 // 1. 创建一个画布资源 $im = imagecreatetruecolor(200, 50); // 2. 创建背景色 // 2.1 得到背景 ...
- ubuntu 解决中文zip乱码问题
用到的工具是The Unarchiver项目提供的lsar/unar工具.The Unarchiver项目主页:http://code.google.com/p/theunarchiver/ 安装(1 ...
- [解决方案] pythonchallenge level 5
l5=requests.get("http://www.pythonchallenge.com/pc/def/banner.p") body = l5.text lists = p ...
- 长沙市轨道交通工程BIM应用招标公告
摘要: 长沙市轨道交通集团有限公司对其长沙市轨道交通3号线一期工程建筑信息模型(BIM)技术应用项目进行国内公开招标 长沙市轨道交通集团有限公司对其长沙市轨道交通3号线一期工程建筑信息模型(BIM)技 ...
- javaweb常见问题解决
问题一.如果是在导入的项目的情况下,多数情况下就是jdk版本与项目的jdk版本不匹配, 解决方法: (1)右击工程->Build Path->Configure Build Path-&g ...