单调队列板子 P1886 滑动窗口

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/YewSpadeJ/article/details/81908561
//滑动窗口
#include<iostream>
#include<cstdio>
using namespace std;
int n,k,hea,tai;
int num[1000005],que[1000005],orde[1000005];
int main()
{
    
    cin>>n>>k;
    for(int i=1;i<=n;i++)
        cin>>num[i];
    hea=0,tai=0;
    for(int i=1;i<=n;i++)
    {
        if(orde[hea]<i-k+1)
            hea++;
        tai++;
        que[tai]=num[i];
        orde[tai]=i;
        int te=1;
        while(que[tai]<=que[tai-te]&&tai-te>=hea)
            te++;
        que[tai-te+1]=que[tai];
        orde[tai-te+1]=orde[tai];
        tai=tai-te+1;
        if(i>=k)
        cout<<que[hea]<<" ";
    }
    cout<<endl;
    hea=0,tai=0;
    for(int i=1;i<=n;i++)
    {
        if(orde[hea]<i-k+1)
            hea++;
        tai++;
        que[tai]=num[i];
        orde[tai]=i;
        int te=1;
        while(que[tai]>=que[tai-te]&&tai-te>=hea)
            te++;
        que[tai-te+1]=que[tai];
        orde[tai-te+1]=orde[tai];
        tai=tai-te+1;
        if(i>=k)
        cout<<que[hea]<<" ";
    }
    return 0;

}

猜你喜欢

转载自blog.csdn.net/YewSpadeJ/article/details/81908561
今日推荐