浅谈队列:https://www.cnblogs.com/AKMer/p/10314965.html

题目传送门:https://www.luogu.org/problemnew/show/P1886

扫两遍,单调队列维护最值即可。

时间复杂度:\(O(n)\)

空间复杂度:\(O(n)\)

代码如下:

#include <cstdio>
using namespace std; const int maxn=1e6+5; int n,k,head,tail;
int a[maxn],list[maxn]; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} int main() {
n=read(),k=read();
for(int i=1;i<=n;i++)
a[i]=read();
for(int i=1;i<=k;i++) {
while(tail!=head&&a[list[tail-1]]>a[i])tail--;
list[tail++]=i;
}
printf("%d ",a[list[head]]);
for(int i=k+1;i<=n;i++) {
while(tail!=head&&a[list[tail-1]]>a[i])tail--;
list[tail++]=i;
while(tail!=head&&i-list[head]>=k)head++;
printf("%d ",a[list[head]]);
}puts("");head=tail=0;
for(int i=1;i<=k;i++) {
while(tail!=head&&a[list[tail-1]]<a[i])tail--;
list[tail++]=i;
}
printf("%d ",a[list[head]]);
for(int i=k+1;i<=n;i++) {
while(tail!=head&&a[list[tail-1]]<a[i])tail--;
list[tail++]=i;
while(tail!=head&&i-list[head]>=k)head++;
printf("%d ",a[list[head]]);
}
return 0;
}

最新文章

  1. delphi WebBrowser控件上网页验证码图片识别教程(一)
  2. dock-compose 安装
  3. Tornado实战项目(伪JD商城)
  4. C#导出Excel,并且设置Excel单元格格式,合并单元格.
  5. Unity3D研究院之LZMA压缩文件与解压文件
  6. 滑屏 H5 开发实践九问
  7. Servlet之创建与配置
  8. 【转】CentOS 6 服务器安全配置指南
  9. css系列:input的placeholder在safari下设置行高失效
  10. vue搭建环境
  11. paddle实践
  12. php使用wkhtmltopdf导出pdf
  13. netty网络通信中的tcp拆包问题
  14. java后台工具类-通过交易码获得方法名
  15. Struts2- 设置默认拦截器
  16. linux技巧-持续更新
  17. python 测试:生成exe文件
  18. 如何理解Hibernate的持久化?
  19. Zabbix 3.4.11监控 apache服务,ftp服务的配置
  20. CentOS 文件特殊权限SUID,SGID,SBIT

热门文章

  1. Android开发之旅-Fragment和Activity之间onCreateOptionsMenu的联系
  2. NSCoder
  3. MongoDB快速入门(六)- 更新文档
  4. Nginx的访问日志配置信息详解
  5. .NET及JAVA 中如何使用代码启动程序
  6. RabbitMQ死信队列
  7. Codeforces Round #425 (Div. 2) D 树链剖分 + 树状数组维护区间
  8. vc 改变控制台字符颜色
  9. C#加密解密DES字符串&lt;转&gt;
  10. QT 创建对话框 Dialog 实例