POJ2823 Sliding Window(单调队列)
2024-10-20 07:20:11
题目要输出一个序列各个长度k的连续子序列的最大值最小值。
多次RMQ的算法也是能过的,不过单调队列O(n)。
这题,队列存元素值以及元素下标,队尾出队维护单调性然后入队,队首出队保持新元素下标与队首元素下标差小于k。
以前写的还是3个if-else,重写了下。。不加输出挂会T。。
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 1111111
inline void in(int &ret){
char c; int sgn;
while(c=getchar(),c!='-'&&(c<''||c>'')) if(c==EOF) return;
sgn=(c=='-')?-:; ret=(c=='-')?:(c-'');
while(c=getchar(),c>=''&&c<='') ret=ret*+(c-'');
ret*=sgn;
}
void out(int x){
if(x<){
putchar('-'); out(-x);
return;
}
if(x>) out(x/);
putchar(x%+'');
}
int que[MAXN],idx[MAXN],front,rear;
int a[MAXN];
int main(){
int n,k;
in(n); in(k);
for(int i=; i<=n; ++i){
in(a[i]);
}
for(int i=; i<=n; ++i){
if(front!=rear && idx[front]+k<=i) ++front;
while(front!=rear && que[rear-]>=a[i]) --rear;
idx[rear]=i; que[rear]=a[i]; ++rear;
if(i>=k){
out(que[front]); putchar(' ');
}
}
putchar('\n');
front=rear=;
for(int i=; i<=n; ++i){
if(front!=rear && idx[front]+k<=i) ++front;
while(front!=rear && que[rear-]<=a[i]) --rear;
idx[rear]=i; que[rear]=a[i]; ++rear;
if(i>=k){
out(que[front]); putchar(' ');
}
}
return ;
}
最新文章
- cookies如何成为全局变量以及设置,删除,获取
- JavaSript模块规范 - AMD规范与CMD规范介绍
- 关于去除Eclipse对JavaScript的验证
- WIZnet官方网盘
- android和ubifs
- C#Winform程序如何发布并自动升级(图解)
- Codebook model 视频抠像 xp sp3 + vs2005 + OpenCV 2.3.1
- 最有用的Linux命令行使用技巧集锦
- 在meteor中使用支付,以及与服务器进行数据交互
- Java调用Telnet示例
- 【HDOJ】1818 It&#39;s not a Bug, It&#39;s a Feature!
- 2015第14周五Tomcat版本
- 一个Socket连接管理池(心跳机制)
- JS中常见排序算法详解
- Android学习探索之App多渠道打包及动态添加修改资源属性
- git for windows上传项目到github
- 属性动画基础之ValueAnimator
- Idea-Java接入银联支付的Demo
- PHP 使用POST 获取不到部分数据问题
- react服务端渲染同构报错Browser history needs a DOM
热门文章
- MFC 中控件的启用与禁用
- [Unity3D]引擎崩溃、异常、警告、BUG与提示总结及解决方法
- mysql.msi安装流程
- 他们在军训,我在搞 OI(一)
- [BZOJ1529][POI2005]ska Piggy banks
- iOS 关于UITableView的dequeueReusableCellWithIdentifier
- LightOJ 1315 - Game of Hyper Knights(博弈sg函数)
- 【转】一个不错的eclipse反编译插件
- mysql中char,varchar,text区别总结
- ORACLE用SYS登录报ORA-28009:connection as SYS should be as SYSDBA OR SYSOPER解决方法