第一组数据RE(以及后面的许多组)求助,最小值输出一个错误的0但最大值正确

P1886 滑动窗口 /【模板】单调队列

MC_Launcher @ 2021-02-15 17:48:35

#include<bits/stdc++.h>
using namespace std;
int a[1000010],dl[10000100][2];
int h,t,now;
int maxn,minn;
int main()
{
    int n,k;
    cin>>n>>k;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    h=1,t=1;
    dl[1][0]=a[1];
    dl[1][1]=1;
    for(int i=2;i<=k;i++)
    {   
        if(a[i]<dl[t][0])
        {
            while(a[i]<dl[t][0])
            {
                dl[t][0]=a[i];
                dl[t][1]=i;
                t--;
                if(t<1)break;
            }
            if(t<1)t=1;
            else t++;
        }
        else
        {
            t++;
            dl[t][0]=a[i];
            dl[t][1]=i;
        }
    }
    cout<<dl[h][0]<<" ";
    for(now=k+1;now<=n;now++)
    {
        if(a[now]<dl[t][0])
        {
            while(a[now]<dl[t][0])
            {
                dl[t][0]=a[now];
                dl[t][1]=now;
                t--;
                if(t<1)break;
            }
            if(t<1)t=1;
            else t++;
        }
        else
        {
            t++;
            dl[t][0]=a[now];
            dl[t][1]=now;
        }
        while(dl[h][1]<now-k+1)h++;
        cout<<dl[h][0]<<" ";
    }
    cout<<endl;
    memset(dl,0,sizeof(dl));
    //...
    h=1,t=1;
    dl[1][0]=a[1];
    dl[1][1]=1;
    for(int i=2;i<=k;i++)
    {
        if(a[i]>dl[t][0])
        {
            while(a[i]>dl[t][0])
            {
                dl[t][0]=a[i];
                dl[t][1]=i;
                t--;
                if(t<1)break;
            }
            if(t<1)t=1;
            else t++;
        }
        else
        {
            t++;
            dl[t][0]=a[i];
            dl[t][1]=i;
        }
    }
    cout<<dl[h][0]<<" ";
    for(now=k+1;now<=n;now++)
    {
        if(a[now]>dl[t][0])
        {
            while(a[now]>dl[t][0])
            {
                dl[t][0]=a[now];
                dl[t][1]=now;
                t--;
                if(t<1)break;
            }
            if(t<1)t=1;
            else t++;
        }
        else
        {
            t++;
            dl[t][0]=a[now];
            dl[t][1]=now;
        }
        while(dl[h][1]<now-k+1)h++;
        cout<<dl[h][0]<<" ";
    }
}

dl数组保存单调队列的数字及其在a数组中下标


by xs_siqi @ 2021-02-15 18:31:05

@MC_Launcher 这很明显吧...

#include<bits/stdc++.h>
using namespace std;
int a[1000010],dl[10000100][2];
int h,t,now;
int maxn,minn;
int main()
{
    int n,k;
    cin>>n>>k;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    h=1,t=1;
    dl[1][0]=a[1];
    dl[1][1]=1;
    for(int i=2;i<=k;i++){   
        if(a[i]<dl[t][0])
        {
            while(a[i]<dl[t][0])
            {
                dl[t][0]=a[i];
                dl[t][1]=i;
                t--;
                if(t<1)break;
            }
            if(t<1)t=1;
            else t++;
        }
        else
        {
            t++;
            dl[t][0]=a[i];
            dl[t][1]=i;
        }
    }
    cout<<dl[h][0]<<" ";
    for(now=k+1;now<=n;now++)
    {
        if(a[now]<dl[t][0])
        {
            while(a[now]<dl[t][0])
            {
                dl[t][0]=a[now];
                dl[t][1]=now;
                t--;
                if(t<1)break;
            }
            if(t<now-k+1)t=now-k+1;//咕 
            else t++;
        }
        else
        {
            t++;
            dl[t][0]=a[now];
            dl[t][1]=now;
        }
        while(dl[h][1]<now-k+1)h++;
        cout<<dl[h][0]<<" ";
    }
    cout<<endl;
    memset(dl,-127,sizeof(dl));//最小值 
    h=1,t=1;
    dl[1][0]=a[1];
    dl[1][1]=1;
    for(int i=2;i<=k;i++)
    {
        if(a[i]>dl[t][0])
        {
            while(a[i]>dl[t][0])
            {
                dl[t][0]=a[i];
                dl[t][1]=i;
                t--;
                if(t<1)break;
            }
            if(t<1)t=1;
            else t++;
        }
        else
        {
            t++;
            dl[t][0]=a[i];
            dl[t][1]=i;
        }
    }
    cout<<dl[h][0]<<" ";
    for(now=k+1;now<=n;now++)
    {
        if(a[now]>dl[t][0])
        {
            while(a[now]>dl[t][0])
            {
                dl[t][0]=a[now];
                dl[t][1]=now;
                t--;
                if(t<1)break;
            }
            if(t<now-k+1)t=now-k+1;//咕
            else t++;
        }
        else
        {
            t++;
            dl[t][0]=a[now];
            dl[t][1]=now;
        }
        while(dl[h][1]<now-k+1)h++;
        cout<<dl[h][0]<<" ";
    }
}

枚举到1啥意思啊,应该枚举到最前面吧...


by MC_Launcher @ 2021-02-15 19:51:13

@xs_siqi 我刚刚自己已经发现了,谢谢大佬%%%


|