POJ 2823 Sliding Window

来源:互联网 发布:hr抢购软件 编辑:程序博客网 时间:2024/06/05 14:12

单调队列实现询问最小值与最大值

#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <iostream>using namespace std;const int maxn=1e6+6;int a[maxn],b[maxn],c[maxn],que[maxn],pos[maxn];int n,k;void Get_min(){//单调队列求每连续k个数的最小值int head=1,tail=0;int i;for(i=0;i<k-1;i++){while(head<=tail && que[tail]>=a[i])--tail;que[++tail]=a[i];pos[tail]=i;}for(;i<n;i++){while(head<=tail && que[tail]>=a[i])--tail;que[++tail]=a[i];pos[tail]=i;while(pos[head]<i-k+1){head++;}b[i-k+1]=que[head];}}void Get_max(){//单调队列求每连续k个数的最大值int head=1,tail=0;int i;for(i=0;i<k-1;i++){while(head<=tail && que[tail]<=a[i])--tail;que[++tail]=a[i];pos[tail]=i;}for(;i<n;i++){while(head<=tail && que[tail]<=a[i])--tail;que[++tail]=a[i];pos[tail]=i;while(pos[head]<i-k+1){head++;}c[i-k+1]=que[head];}}int main(int argc, char const *argv[]){while(~scanf("%d %d",&n,&k)){for(int i=0;i<n;i++){scanf("%d",&a[i]);}Get_min();Get_max();for(int i=0;i<=n-k;i++){printf("%d%c",b[i],i==n-k?'\n':' ');}for(int i=0;i<=n-k;i++){printf("%d%c",c[i],i==n-k?'\n':' ');}}return 0;}