zoukankan      html  css  js  c++  java
  • POJ2823 Sliding Window

    这是一个经典的单调序列的使用。单调队列,顾名思义是指队列内的元素是有序的,队头为当前的最大值(单调递减队列)或最小值(单调递增序列),以单调递减队列为例来看队列的入队和出队操作:
    1、入队:
    如果当前元素要进队,把当前元素和队尾元素比较,如果当前元素小于队尾元素,那么当前元素直接进队,如果当前元素大于队尾元素,那么队尾出队,将当前元素和新的队尾再做比较,直到当前元素大于队尾元素或者队列为空。单调队列只能在队尾插入元素,队尾和队头都可以删除元素。
    2、出队:
    出队直接取队头即可,因为用单调队列就是为了取最值,而队头就是最值。
    因为每个元素都出队列进队列一次,而且进出没有多余的比较,所以平摊下来是O(n)的。

    http://blog.csdn.net/f_x_q/article/details/10011805

    实现采用了deque,就比较方便,也可以用数组记录头尾模拟。处理时注意结果元素的数组总共有n-k+1个就行了。

    #include <cstdio>
    #include <queue>
    #define LEN 1000005
    using namespace std;
    int num[LEN];
    int max_ans[LEN];
    int min_ans[LEN];
    int n, k;
    
    void process_max() {
        deque<int> que;
        for (int i = 0; i < n; i++) {
            while (!que.empty() && que.front() <= i - k) {
                que.pop_front();
            }
            while(!que.empty() && num[que.back()] < num[i]) {
                que.pop_back();
            }
            que.push_back(i);
            if (i >= k -1) {
                max_ans[i - k + 1] = num[que.front()];
            }
        }
    }
    
    void process_min() {
        deque<int> que;
        for (int i = 0; i < n; i++) {
            while (!que.empty() && que.front() <= i - k) {
                que.pop_front();
            }
            while(!que.empty() && num[que.back()] > num[i]) {
                que.pop_back();
            }
            que.push_back(i);
            if (i >= k -1) {
                min_ans[i - k + 1] = num[que.front()];
            }
        }
    }
    
    int main() {
        scanf("%d", &n);
        scanf("%d", &k);
        for (int i = 0; i < n; i++) {
            scanf("%d", &num[i]);
        }
        process_max();
        process_min();
        for (int i = 0; i < n - k + 1; i++) {
            printf("%d ", min_ans[i]);
        }
        printf("
    ");
        for (int i = 0; i < n - k + 1; i++) {
            printf("%d ", max_ans[i]);
        }
        printf("
    ");
    }
    

      

  • 相关阅读:
    js--事件
    js之table操作
    2019年目标
    history.back返回后输入框值丢失问题
    C++ 工程师养成 每日一题4.5 (迭代器遍历)
    C++ 工程师养成 每日一题fourth (reverse的使用)
    C++ 工程师养成 每日一题third (子数列排序)
    C++工程师养成 每日一题(string使用)
    C++工程师养成 每日一题(vector使用)
    运算符优先级
  • 原文地址:https://www.cnblogs.com/lautsie/p/3417094.html
Copyright © 2011-2022 走看看