【P1886】滑动窗口(单调队列→线段树→LCT)

这个题很友好,我们可以分别进行简单难度,中等难度,恶心难度来做。然而智商没问题的话肯定是用单调队列来做。。。

板子题,直接裸的单调队列就能过。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define re register
#define wc 0.0000000001
using namespace std;
int qmax[1000001],qmin[1000001],n,m,k,a[1000001],maxx[1000001],minn[1000001],num;
int h1,t1,h2,t2;
inline void smax(int x)
{
    while(h1<=t1&&a[qmax[t1]]<=a[x])
    t1--;
    qmax[++t1]=x;
    while(qmax[h1]<=x-k)
    h1++;
    return;
}
inline void smin(int x)
{
    while(h2<=t2&&a[qmin[t2]]>=a[x])
    t2--;
    qmin[++t2]=x;
    while(qmin[h2]<=x-k)
    h2++;
    return;
}
int main()
{
    cin>>n>>k;
    for(re int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    h1=1,t1=0;h2=1,t2=0;
    for(re int i=1;i<=n;i++)
    {
        smax(i);
        smin(i);
        if(i>=k)
        {
            maxx[++num]=a[qmax[h1]];
            minn[num]=a[qmin[h2]];
        }
    }
    for(re int i=1;i<=num;i++)
    cout<<minn[i]<<" ";
    cout<<endl;
    for(re int i=1;i<=num;i++)
    cout<<maxx[i]<<" ";
    return 0;
}

 

posted @ 2018-02-07 15:44  ~victorique~  阅读(148)  评论(0编辑  收藏  举报
Live2D