poj 2823 Sliding Window(单调队列)

/*
裸地单调队列..
第一次写 写的好丑.... 
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 1000010
using namespace std;
int n,k,x,a[maxn],t[maxn],q[maxn],head=1,tail;
int init()
{
    int f=1,x=0;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
    return x*f;
}
int main()
{
    n=init();k=init();
    for(int i=1;i<=n;i++)a[i]=init();
    for(int i=1;i<=k-1;i++)
      {
          x=a[i];
          while(x<q[tail]&&tail>=head)tail--;
          q[++tail]=x;t[tail]=i;
          if(i-t[head]+1>k)head++;
      }
    for(int i=k;i<=n;i++)
      {
          x=a[i];
          while(x<q[tail]&&tail>=head)tail--;
          q[++tail]=x;t[tail]=i;
          if(i-t[head]+1>k)head++;
          printf("%d ",q[head]);
      }
    tail=0;head=1;printf("\n");
    for(int i=1;i<=k-1;i++)
      {
          x=a[i];
          while(x>q[tail]&&tail>=head)tail--;
          q[++tail]=x;t[tail]=i;
          if(i-t[head]+1>k)head++;
      }
    for(int i=k;i<=n;i++)
      {
          x=a[i];
          while(x>q[tail]&&tail>=head)tail--;
          q[++tail]=x;t[tail]=i;
          if(i-t[head]+1>k)head++;
          printf("%d ",q[head]);
      }
    return 0;
}

 

posted @ 2016-07-25 10:29  一入OI深似海  阅读(109)  评论(0编辑  收藏  举报