POJ2823-Sliding Window

来源:互联网 发布:永琪和知画圆房的视频 编辑:程序博客网 时间:2024/06/05 19:08

给定一群数的集合,然后有一个大小为k的区间,这个区间从左往右滑动,输出每滑动一次,这个区间内的最大值和最小值。
G++无情的TLE了,但是!!C++压线过了!!
总之就是一个基本的单调队列,瞎搞一下就行了。

#include <cstdio>#include <deque>using namespace std;const int maxn = 1000000 + 10;int window[maxn];int main(int argc, char const *argv[]) {    int n, k;    scanf("%d%d", &n, &k);    for (int i = 0; i < n; i++) {        scanf("%d", &window[i]);    }    deque<pair<int, int> > deq;    for (int i = 0; i < n; i++) {        int val = window[i];        while (!deq.empty() && val <= deq.back().first) {            deq.pop_back();        }        deq.push_back(make_pair(val, i));        if (i >= k - 1) {            while (!deq.empty() && deq.front().second < i - k + 1) {                deq.pop_front();            }            printf("%d", deq.front().first);            if (i != n - 1) {                putchar(' ');            }        }    }    putchar('\n');    deq.clear();    for (int i = 0; i < n; i++) {        int val = window[i];        while (!deq.empty() && val >= deq.back().first) {            deq.pop_back();        }        deq.push_back(make_pair(val, i));        if (i >= k - 1) {            while (!deq.empty() && deq.front().second < i - k + 1) {                deq.pop_front();            }            printf("%d", deq.front().first);            if (i != n - 1) {                putchar(' ');            }        }    }    putchar('\n');    return 0;}
0 0
原创粉丝点击