洛谷【P1886】滑动窗口
2024-09-26 21:55:27
浅谈队列: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;
}
最新文章
- delphi WebBrowser控件上网页验证码图片识别教程(一)
- dock-compose 安装
- Tornado实战项目(伪JD商城)
- C#导出Excel,并且设置Excel单元格格式,合并单元格.
- Unity3D研究院之LZMA压缩文件与解压文件
- 滑屏 H5 开发实践九问
- Servlet之创建与配置
- 【转】CentOS 6 服务器安全配置指南
- css系列:input的placeholder在safari下设置行高失效
- vue搭建环境
- paddle实践
- php使用wkhtmltopdf导出pdf
- netty网络通信中的tcp拆包问题
- java后台工具类-通过交易码获得方法名
- Struts2- 设置默认拦截器
- linux技巧-持续更新
- python 测试:生成exe文件
- 如何理解Hibernate的持久化?
- Zabbix 3.4.11监控 apache服务,ftp服务的配置
- CentOS 文件特殊权限SUID,SGID,SBIT