Ural_1126. Magnetic Storms 单调队列

  话说单调队列!= 优先队列。可怜我捧着算导看了半天优先队列。题意读的很费劲,最后问得师兄。就是给定一个M,然后再给一个序列,求给出的序列里连续M个数中的最大值。最后把这些最大值输出,其实就是很裸的单调队列。然后开始在网上搜有关单调队列的资料,从这里http://www.felix021.com/blog/read.php?1965学会的。其实就是维持队列的单调性,别管是单调增还是单调减。队头元素永远是最列的最小值(或最大值)。

 

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int N = 25005;

struct node {
int i;
int num;
}q[N];

int ans[N];

int main() {
//freopen("data.in", "r", stdin);

int m, t, k;
int f, r;
scanf("%d", &m);
scanf("%d", &t);
f = r = k = 0;
while(t != -1) {
if(f < r && q[f].i <= k - m) f++; //太旧的元素删除
while(f < r && q[r-1].num <= t) r--; //比t小的元素删除

q[r].i = k; q[r].num = t; r++; //入队列
ans[k] = q[f].num; k++;

scanf("%d", &t);
}
for(t = m-1; t < k; t++)
printf("%d\n", ans[t]);
return 0;
}

PS:开始把内存空间开小了,Crash了两次。个人感觉可以用滚动数组优化,不过没写。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值