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;}