题目描述

给你一个长度为 N 的数组,一个长为 K 的滑动的窗体从最左移至最右端,你只能见到窗口的 K 个整数,每次窗体向右移动一位,如下表:

aaarticlea/png;base64,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" alt="" />

你的任务是找出窗口在各位置时的最大值和最小值。

输入格式

输入的第 1 行是两个整数 n,k,第 2 行为长度为 n 的数组(即有 n 个整数)。

输出格式

输出 2 行,第 1 行是每个位置的最小值,第 2 行是每个位置的最大值。

样例数据 1

输入  [复制]

8 3 
1 3 -1 -3 5 3 6 7

输出

-1 -3 -3 -3 3 3 
3 3 5 5 6 7

备注

【数据范围】

对于 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 ;
}

最新文章

  1. -bash: fork: retry: Resource temporarily unavailable
  2. openstack 流量控制
  3. 第一次正式小用Redis存储
  4. Appium小试
  5. 2016第20周四java基础概念
  6. error: qrc_qml.obj: requires unsupported dynamic reloc R_ARM_REL32; recompile with -fPIC解决办法
  7. Android Animations 视图动画使用详解!!!
  8. udp 服务器界面监听
  9. springmvc03-异常处理-静态文件
  10. Python 字典和json的本质区别(个人理解)
  11. IEEE1588 verision2 报文介绍
  12. HTML篇(下&#183;)
  13. RPC的基础:调研EOS插件http_plugin
  14. Matlab绘制三维曲面(以二维高斯函数为例)
  15. Plantuml画图工具
  16. 2、iptables基本应用
  17. (二)收集的MongoDB命令集合
  18. 【代码笔记】iOS-可拷贝的label
  19. Json和XML解析
  20. 如何让EasyUI弹出层跳出框架

热门文章

  1. 浅析C#组件编程中的一些小细节
  2. 【AtCoder Regular Contest 082 A】Together
  3. apache+nginx 实现动静分离
  4. (转)Windows Server 2012 R2虚拟机自激活(AVMA)技术
  5. 短网址ShortUrl的算法
  6. js变量值传到php(先把php解析成数据)
  7. jedis连接sentinel示例程序
  8. 大战C100K之-Linux内核调优篇--转载
  9. C语言深度剖析-----数组基础
  10. 9.11 Binder系统_分层