zoukankan      html  css  js  c++  java
  • 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了两次。个人感觉可以用滚动数组优化,不过没写。。。

  • 相关阅读:
    OC block声明和使用
    OC 内存管理(retain和release)
    OC @class关键字
    OC typedef(起别名)
    OC static 和函数
    OC static 和变量
    java【基础】日期操作
    java【基础】正则表达式
    理解String拼接,+运算符重载的实际效果
    swoole的EventLoop学习
  • 原文地址:https://www.cnblogs.com/vongang/p/2256313.html
Copyright © 2011-2022 走看看