2823 Sliding Window //单调队列

来源:互联网 发布:阿里云服务器客服电话 编辑:程序博客网 时间:2024/09/21 06:34

#include <cstdio>const int MAXN = 1000000 + 123;struct people{    int id, val;    people(int x, int y): id(x), val(y) {}    people() {}} q[MAXN];int a[MAXN];int da[MAXN], db[MAXN];int main(){    int n, k;    while(scanf("%d%d", &n, &k) != EOF)    {        for(int i = 0; i < n; i++)  scanf("%d", &a[i]);        //求大值        int head = 0, tail = -1 , leave = 0;        int ka = 0;        for(int i = 0; i < k; i++)        {            while(tail >= head && q[tail].val <= a[i]) tail--;            people now(++ka, a[i]);            q[++tail] = now;        }        for(int i = k; i < n; i++)        {            while(tail >= head && q[head].id <= leave) head++;            da[i - k] = q[head].val;            leave++;            while(tail >= head && q[tail].val <= a[i]) tail--;            people now(++ka, a[i]);            q[++tail] = now;        }        while(tail >= head && q[head].id <= leave) head++;        da[n - k] = q[head].val;        //求小值        head = 0, tail = -1 , leave = 0;        ka = 0;        for(int i = 0; i < k; i++)        {            while(tail >= head && q[tail].val >= a[i]) tail--;            people now(++ka, a[i]);            q[++tail] = now;        }        for(int i = k; i < n; i++)        {            while(tail >= head && q[head].id <= leave) head++;            db[i - k] = q[head].val;            leave++;            while(tail >= head && q[tail].val >= a[i]) tail--;            people now(++ka, a[i]);            q[++tail] = now;        }        while(tail >= head && q[head].id <= leave) head++;        db[n - k] = q[head].val;        for(int  i = 0; i < n - k; i++)  printf("%d ", db[i]);        printf("%d\n", db[n - k]);        for(int  i = 0; i < n - k; i++)  printf("%d ", da[i]);        printf("%d\n", da[n - k]);    }    return 0;}


原创粉丝点击