【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 ...
随机推荐
- poj 3122
Pie Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10309 Accepted: 3651 Special Ju ...
- macOS 上配置 Lua
[最新版]从零开始在 macOS 上配置 Lua 开发环境 脚本语言,你可能更需要的是 Lua 不同的脚本语言有不同的特性,第一接触的脚本语言,可能会影响自己对整个脚本语言的理解和认知.我以前接触 ...
- POJ 3041 Asteroids 最小覆盖数
http://poj.org/problem?id=3041 题目大意: 一辆宇宙飞船在一个小行星带中,你知道,这很危险.他有一种武器,可以清除掉一行或一列的小行星.问把小行星全部清除最少的武器使用次 ...
- oracle exp 备份脚本
#!/bin/bash#Oracle 环境变量 NLS_LANG=AMERICAN_AMERICA.AL32UTF8 ORACLE_SID=zgw ORACLE_BASE=/opt/oracle OR ...
- [算法系列之二十七]Kruskal最小生成树算法
简单介绍 求最小生成树一共同拥有两种算法,一个是就是本文所说的Kruskal算法,还有一个就是Prime算法. 在具体解说Kruskal最小生成树算法之前,让我们先回想一下什么是最小生成树. 我们有一 ...
- 【AtCoder ABC 075 A】One out of Three
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 用map轻松搞定 [代码] #include <bits/stdc++.h> using namespace std; ...
- 对照jQuery和AngularJS的不同思维模
对照jQuery和AngularJS的不同思维模 Question 如果我已经熟悉了怎样使用jQuery来开发client应用.我如今打算使用AngularJS.请描写叙述一下有那些思维模式方面的东西 ...
- linux中的rootfs/initrd/ramfs/initramfs
什么是ramfs?ramfs是空间规模动态变化的RAM文件系统.它非常简单,是用来实现Linux缓存机制(缓存page cache and dentry cache)的文件系统.通常情况下,Linux ...
- C++中string类的操作函数。
相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是肯 ...
- 【topcoder SRM 702 DIV 2 250】TestTaking
Problem Statement Recently, Alice had to take a test. The test consisted of a sequence of true/false ...