【Sliding Window】单调队列
题目描述
给你一个长度为 N 的数组,一个长为 K 的滑动的窗体从最左移至最右端,你只能见到窗口的 K 个整数,每次窗体向右移动一位,如下表:
aaarticlea/png;base64,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" alt="" />
你的任务是找出窗口在各位置时的最大值和最小值。
输入格式
输入的第 1 行是两个整数 n,k,第 2 行为长度为 n 的数组(即有 n 个整数)。
输出格式
输出 2 行,第 1 行是每个位置的最小值,第 2 行是每个位置的最大值。
样例数据 1
备注
【数据范围】
对于 20% 的数据:n<=500;
对于 50% 的数据:n<=100000;
对于 100% 的数据:n<=1000000;
题目分析
入门级别单调队列。分别维护一个单调递增和单调递减的队列,每次添加新数并维护单调性,然后删除队首的在区间外面的数,最后队首就是答案。
code
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std; const int N = , oo = 0x3f3f3f3f;
typedef pair<int, int> P;
int data[N], head, tail, n, k;
P que[N]; inline int read(){
int i = , f = ; char ch = getchar();
for(; (ch < '' || ch > '') && ch != '-'; ch = getchar());
if(ch == '-') f = -, ch = getchar();
for(; ch >= '' && ch <= ''; ch = getchar())
i = (i << ) + (i << ) + (ch - '');
return i * f;
} inline void wr(int x){
if(x < ) putchar('-'), x = -x;
if(x > ) wr(x / );
putchar(x % + '');
} int main(){
n = read(), k = read();
for(int i = ; i <= n; i++) data[i] = read();
tail = head = ;
que[head].second = oo;
for(int i = ; i <= n; i++){
if(data[i] < que[head].second)
que[head = tail = ] = P(i, data[i]);
else{
while(head < tail && que[tail].second > data[i]) tail--;
que[++tail] = P(i, data[i]);
}
while(que[head].first <= i - k) head++;
if(i >= k)
wr(que[head].second), putchar(' ');
// cout<<endl<<"!!";for(int j = head; j <= tail; j++) cout<<"("<<que[j].first<<") "<<que[j].second<<" ";cout<<endl;
}
putchar('\n');
tail = head = ;
que[head].second = -oo;
for(int i = ; i <= n; i++){
if(data[i] > que[head].second)
que[head = tail = ] = P(i, data[i]);
else{
while(head < tail && que[tail].second < data[i]) tail--;
que[++tail] = P(i, data[i]);
}
while(que[head].first <= i - k) head++;
if(i >= k)
wr(que[head].second), putchar(' ');
// cout<<endl<<"!!";for(int j = head; j <= tail; j++) cout<<que[j].first<<" "<<que[j].second<<" ";cout<<endl;
}
return ;
}
【Sliding 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上看很多人也在抱怨超时的问题,据说 ...
- poj 2823 Sliding Windows (单调队列+输入输出挂)
Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 73426 Accepted: 20849 ...
- 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 ...
随机推荐
- VC6.0调试知识大全
VC6.0调试知识大全 分类: C++ 2010-09-06 21:33 7080人阅读 评论(5) 收藏 举报 debuggingmfcfunctionmenumicrosoftdll My Not ...
- 洛谷 P3650 [USACO1.3]滑雪课程设计Ski Course Design
P3650 [USACO1.3]滑雪课程设计Ski Course Design 题目描述 农民约翰的农场里有N座山峰(1<=N<=1000),每座山都有一个在0到100之间的整数的海拔高度 ...
- 13. 关于IDEA工具在springboot整合mybatis中出现的Invalid bound statement (not found)问题
在一切准备就绪之后,测试test,却出现了org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) ...
- POJ 3669 Meteor Shower BFS 水~
http://poj.org/problem?id=3669 题目大意: 一个人从(0,0)出发,这个地方会落下陨石,当陨石落在(x,y)时,会把(x,y)这个地方和相邻的的四个地方破坏掉,求该人到达 ...
- 【hdu 2328】Corporate Identity
[链接]h在这里写链接 [题意] 找一个字典序最小的公共最长子串; [题解] 后缀数组. 把所有的串用不同的分隔符分开.(大于'z'的分隔符); 然后求出那几个固定的数组. 二分一下那个子串的长度. ...
- JavaScript系列--JavaScript数组高阶函数reduce()方法详解及奇淫技巧
一.前言 reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值. reduce() 可以作为一个高阶函数,用于函数的 compose. reduce()方 ...
- P2P网贷中的4种理财业务模式
线上3种 直投标:线上理财人直接购买借款人的标,平台只是起个"撮合"作用,收点借款人的服务费. 借款人不还钱,有的平台会帮"借款人"还 ...
- kafka集群操作指南
目录 kafka集群操作指南 (一)单机版安装 (二)集群安装 (三)集群启停操作 (四)topic相关的操作 (五)某个broker挂掉,本机器可重启 (六)某个broker挂掉且无法重启,需要其它 ...
- [Angular Unit Testing] Debug unit testing -- component rendering
If sometime you want to log out the comonent html to see whether the html render correctly, you can ...
- Ubuntu下成功安装QQ2013
阳光小强最近用Win8系统感觉特别不爽,中午果断换了一个win7系统,又想着能不能搞个双系统(最近在看一些linux东西),于是就开始整起来.结果并不好,linux虽然整好了,但是硬盘全部格式化了,当 ...