单调队列+单调栈

版权声明:转载请注明出处: https://blog.csdn.net/weixin_43871781/article/details/87822598

单调队列(增):

int main()
{
    int n,k,head,tail,a[105],b[105];
    while(~scanf("%d%d",&n,&k))
    {
        memset(b,-1,sizeof(b));
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        head=1;tail=1;
        b[head]=1;
        for(int i=1;i<=k;i++)
        {
            while(head<=tail&&a[i]>a[b[tail]])tail--;
            b[++tail]=i;
        }
        for(int i=k;i<=n;i++)
        {
            while(head<=tail&&a[i]>a[b[tail]])tail--;
            b[++tail]=i;
            while(head<=tail&&b[head]<i-k+1)head++;
            printf("%d\n",a[b[head]]);
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43871781/article/details/87822598